We are Architect

26. 파이썬으로 만드는 웹 스크래핑 본문

Programing/Python

26. 파이썬으로 만드는 웹 스크래핑

the best infra 2024. 11. 24. 01:45

 

* 웹 스크래핑이란?

- 어떤 특정 웹 페이지의 특정 항목에 대한 데이터를 추출하는 기술. 

- 예를 들어 어떤 제품의 데이터만을 추출하기 위해서 사용한다. 

- 프로그램 제작 시 사용되는 다양한 도구들: 

  - BeautifulSoup:

     - HTML 혹은 XML파일의 데이터를 추출하여서 분석 후에 데이터를 추출.

     - 웹 페이지의 구조를 분석하고 특정 태그 <div>, <table> 등의 태그에서 데이터를 가져온다.

     - 정적 웹페이지에서 간단한 데이터를 가져오는 데 사용.

     - 예를 들어 <h2> 와 같은 제목 태그의 있는 정보를 가져와서 추출. 

  - Scrapy

     - 웹 스크래핑을 하기 위한 프레임 워크. 

     - 크롤러 설계, 데이터 파이프 라인, 효율적인 탐색 기능 제공. 

     - 비동기식으로 데이터를 빠르게 가져오기 가능. 

     - 예를 들어 이커머스 플랫폼의 모든 제품 정보를 수집. 

  - Selenium

     - 브라우저 자동화를 통해서 동적 콘텐츠를 스크래핑.

     - jscript를 * 렌더링 해야하는 웹 페이지 스크래핑.    

     - 실제 브라우저를 실행하여 사용자 행동을 재현.

     - 크롬, 파이어 폭스 등 다양한 브라우저 지원. 

     - 로그인 후 접근 가능한 데이터 수집. 

      *렌더링: 웹 페이지의 코드가 브라우저에 출력되는 것. 

- request

     - HTTP 요청을 통해 웹 페이지의 HTML 소스 가져오기.

     - 정적 웹 페이지의 콘텐츠를 가져오는 데 사용. 

     - HTML 코드를 BeautifulSoup이나 다른 라이브러리로 처리하기 위한 기본 도구. 

     - 간단한 문법으로 GET, POST, PUT 등 다양한 HTTP 요청지원

     - 정적 웹페이지의 HTML 코드를 가져올 때 사용한다.  

 

 

* GET, PUT, POST

- HTTP의 메서드들이다. 서버와 클라이언트 간의 데이터를 전송하는 방법을 정한다. 

- GET: 서버로 부터 데이터를 요청할 때 사용하는 용도. 데이터를 가져오기만 하고 바뀌는 건 없음.

# GET 생긴 모습
https://example.com/books?category=science

- PUT: 서버에 수정해야 할 사항 또는 생성해야 할 요청이 있다면 보내는 용도. 보낼 데이터를 본문 안에 넣는다. 특히 회원 정보 등을 수정할 때 사용하며 보내는 내용을 서버에 덮어 씌운다. 

- POST: 서버에 추가해야 할 내용을 보내는 용도로 사용. 본문 안에 숨겨서 보낸다. 회원가입, 댓글 추가 등을 할 때 사용한다. 데이터를 추가해서 서버의 내용을 바꾼다.  

- * 멱등성: 코드를 몆번이나 실행해도 똑같은 값이 나오는 경우. 

메서드 목적 데이터의 위치 *멱등성 안전성 사용예시
GET 데이터 조회 URL 쿼리 O O 리소스 가져오기
PUT 데이터 생성 본문 X X 사용자 등록하기
POST 데이터 수정 본문 O X 사용자 정보변경

 

 

* 선택한 도구들 

- 여러 블로그들을 참고하여 도구는 BeautifulSoup4 request이라는 파이썬 모듈들을 채택하였다. 

 

 

* 개발 전 준비

- BeautifulSoup4와 request를 설치해 준다. 

BeautifulSoup4
request

 

 

* 찾고자 하는 내용 가져오기 

- 지니뮤직에서 실시간 차트의 목록을 가져오고 싶고 우선 해당 페이지를 스크롤하는 코드를 작성한다. 

- 2024.11.24 기준 차트 2위에 있는 곡인 APT를 출력해 볼 것이다.

import  requests # 필요한 url를 가져오기 위한 모듈. 
from bs4 import BeautifulSoup  # 데이터 분석후 추출하기 위한 모듈. 

# headers, 유저의 http헤더를 달고 브라우저에 접속하는 것 처럼 보이게 하는 딕셔너리 값. 
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}

# data, 해당 주소의 스크래핑 할 주소를 가져온다. (지니뮤직) 
data = requests.get('https://www.genie.co.kr/', headers=headers)

# soup, 가져온 HTML데이터를 Bs객체로 변환한다. 그리고 parser를 사용하여 구조적으로 이해하고 탐색할 수 있게 한다. 
# 이후에는 특정 태그나 내용을 추출할 때 사용된다. 
soup = BeautifulSoup(data.text, 'html.parser')

# soup변수값 출력
print(soup)

해당 페이지에서 해당 문구 가져오기

 

HMTL코드에서 해당 문구 찾아보기

 

 

 

* Selector로 원하는 데이터 값 복사 후 가져온 데이터의 부분만 출력하기

- select_one() 함수를 사용하여 정확한 데이터의 요소값을 출력.

해당 페이지에서 F12를 누르고 요소값에서 정확한 데이터 copy > selector

 

해당 값을 select_one() 함수에 넣기

 

import  requests # 필요한 url를 가져오기 위한 모듈. 
from bs4 import BeautifulSoup  # 데이터 분석후 추출하기 위한 모듈. 

# headers, 유저의 http헤더를 달고 브라우저에 접속하는 것 처럼 보이게 하는 딕셔너리 값. 
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}

# data, 해당 주소의 스크래핑 할 주소를 가져온다. (지니뮤직) 
data = requests.get('https://www.genie.co.kr/', headers=headers)

# soup, 가져온 HTML데이터를 Bs객체로 변환한다. 그리고 parser를 사용하여 구조적으로 이해하고 탐색할 수 있게 한다. 
# 이후에는 특정 태그나 내용을 추출할 때 사용된다. 
soup = BeautifulSoup(data.text, 'html.parser')

# 가져온 HTML 데이터에서 정확한 요소값을 가져와서 select_one()함수: 하나의 요소 값을 가져오는 함수를 사용해서 변수에 넣어줌. 
title = soup.select_one("#body-content > div.main-wrap.clearfix > div.chart > div > div > table > tbody > tr:nth-child(2) > td.info > a.title.ellipsis")

print(title)

 

 

2위 차트 곡인 'APT' 곡을 가져왔다

 

 

텍스트 부분만 출력하게 해서 안에 내용을 출력

 

- 이렇게 하면 해당 필요한 값만 페이지에서 추출할 수 있는 프로그램이 완성된다. 

 

 

# 참고 자료 출처: 채야미님 블로그 > https://chaeyami.tistory.com/12