스크래핑에 흔히 사용되는 Requests 모듈과 BeautifulSoup을 사용해 HTML 데이터를 불러오는 연습을 해보았다.
Python의 requests 모듈은 웹 리소스와 상호작용하기 위해 HTTP 요청을 보내는 데 사용되는 편리한 라이브러리다.
1. 설치
Requests 모듈은 pip(파이썬의 패키지 설치 도구)를 사용하여 설치할 수 있다.
pip install requests
2. 임포트
Requests 모듈과 BeautifulSoup를 불러온다.
import requests
from bs4 import BeautifulSoup
3. GET 요청 보내기
웹사이트에서 데이터를 스크래핑하려면 일반적으로 웹페이지의 URL로 GET 요청을 보내는 것으로 시작한다. 이를 위해 requests.get() 함수를 사용한다. 이 함수는 서버의 요청에 대한 응답을 담은 Response 객체를 반환한다.
url = 'https://finance.naver.com/marketindex/'
response = requests.get(url)
4. 응답 확인하기
응답을 확인하여 HTTP 상태 코드, 내용, 헤더 등의 관련 정보를 확인할 수 있다.
print(response.status_code) # HTTP 상태 코드
print(response.text) # 응답 내용 (HTML 내용)
5. HTML 파싱
HTML 내용에서 특정 정보를 추출하기 위해 일반적으로 BeautifulSoup 또는 lxml과 같은 파싱 라이브러리를 사용한다. 이러한 라이브러리를 사용하여 HTML 구조를 탐색하고 데이터를 추출할 수 있다.
soup = BeautifulSoup(response.text, 'html.parser')
print(soup.prettify())
6. 헤더와 매개변수 다루기
스크래핑 중에 요청과 함께 헤더, 쿠키 또는 매개변수를 전달해야 할 수 있다. 요청 함수에 헤더 또는 매개변수의 딕셔너리를 제공하여 이를 수행할 수 있다. (이 부분은 연습 과정에서 다루지 않았다.)
headers = {'User-Agent': 'your-user-agent'}
params = {'param_key': 'param_value'}
response = requests.get(url, headers=headers, params=params)
7. 동적 콘텐츠 다루기
일부 웹사이트는 콘텐츠를 동적으로 로드하기 위해 JavaScript를 사용한다. 이러한 경우 requests만으로는 충분하지 않을 수 있다. 동적 요소와 상호작용하기 위해 Selenium과 같은 추가 라이브러리를 사용해야 할 수 있다(추후 학습 예정).
이렇게 추출과정을 거친 데이터를 데이터프레임에 입력해서 저장할 수 있다.
import pandas as pd
exchange_datas = []
baseURL = "https://finance.naver.com"
for item in exchangeList:
data = {
"title": item.select_one('.h_lst').text,
"exchange": item.select_one('.value').text,
"change": item.select_one('.change').text,
"updown": item.select_one('.head_info.point_dn > .blind').text,
"link": baseURL + item.select_one('a').get("href")
}
exchange_datas.append(data)
df = pd.DataFrame(exchange_datas)
df.to_excel("./naverfinance.xlsx", encoding='utf-8')
위 코드는 네이버 금융 사이트에 표시되는 시장지표 내의 세부 값들을 각각 title, exchange, change, updown, link의 변수에 할당하여 Pandas 데이터프레임에 저장하는 작업을 수행한다.
작업을 수행하는 사이트의 형태에 따라 위 코드는 변경될 수 있겠으나, 일반적으로 HTML코드의 id_name을 이용해 텍스트를 추출하는 것이 권장된다고 한다.