11장: 웹 스크래핑
웹 스크래핑(Web Scraping)은 웹 페이지에서 데이터를 추출하는 기술입니다. 파이썬에서는 `requests`와 `BeautifulSoup` 같은 라이브러리를 사용하여 웹 페이지에서 데이터를 쉽게 추출할 수 있습니다. 이 장에서는 웹 스크래핑의 기본 개념과 실제 예제를 통해 웹 스크래핑을 하는 방법을 알아보겠습니다.
#### 11.1 `requests` 라이브러리
`requests` 라이브러리는 HTTP 요청을 보내고 응답을 받기 위한 간단한 인터페이스를 제공합니다. `requests`를 사용하여 웹 페이지의 HTML 소스를 가져올 수 있습니다.
```python
import requests
# 웹 페이지 요청
url = 'https://example.com'
response = requests.get(url)
# 응답 상태 코드 확인
print(response.status_code) # 출력: 200
# HTML 소스 출력
print(response.text)
```
#### 11.2 `BeautifulSoup` 라이브러리
`BeautifulSoup` 라이브러리는 HTML과 XML 문서를 파싱하기 위한 라이브러리입니다. `BeautifulSoup`를 사용하여 웹 페이지에서 필요한 데이터를 추출할 수 있습니다.
먼저, `BeautifulSoup` 라이브러리를 설치해야 합니다.
```sh
pip install beautifulsoup4
```
`BeautifulSoup`를 사용하여 HTML 문서를 파싱하고 원하는 데이터를 추출하는 예제입니다.
```python
from bs4 import BeautifulSoup
# HTML 소스 가져오기
url = 'https://example.com'
response = requests.get(url)
# BeautifulSoup 객체 생성
soup = BeautifulSoup(response.text, 'html.parser')
# 제목 태그 추출
title = soup.find('title')
print(title.text)
# 모든 링크 추출
links = soup.find_all('a')
for link in links:
print(link.get('href'))
```
#### 11.3 CSS 셀렉터 사용
`BeautifulSoup`는 CSS 셀렉터를 사용하여 특정 요소를 선택할 수 있습니다. `select_one`과 `select` 메서드를 사용하여 CSS 셀렉터로 요소를 선택할 수 있습니다.
```python
# CSS 셀렉터 사용
title = soup.select_one('title')
print(title.text)
# 특정 클래스의 모든 요소 선택
items = soup.select('.item')
for item in items:
print(item.text)
```
#### 11.4 웹 스크래핑 예제: 뉴스 기사 제목 추출
다음은 실제 웹 페이지에서 뉴스 기사 제목을 추출하는 예제입니다.
```python
import requests
from bs4 import BeautifulSoup
# 뉴스 웹 페이지 요청
url = 'https://news.ycombinator.com/'
response = requests.get(url)
# BeautifulSoup 객체 생성
soup = BeautifulSoup(response.text, 'html.parser')
# 뉴스 기사 제목 추출
titles = soup.select('.storylink')
for title in titles:
print(title.text)
```
#### 11.5 동적 웹 페이지 스크래핑
동적 웹 페이지에서 데이터를 추출하려면 JavaScript가 실행된 후의 HTML을 가져와야 합니다. 이를 위해 `selenium` 라이브러리를 사용할 수 있습니다. `selenium`은 웹 브라우저를 자동화하는 도구입니다.
먼저, `selenium` 라이브러리를 설치해야 합니다.
```sh
pip install selenium
```
그리고 웹 브라우저 드라이버(예: ChromeDriver)를 설치해야 합니다.
다음은 `selenium`을 사용하여 동적 웹 페이지에서 데이터를 추출하는 예제입니다.
```python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
# 웹 브라우저 드라이버 설정
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
# 웹 페이지 요청
url = 'https://example.com'
driver.get(url)
# 페이지 로드 대기
driver.implicitly_wait(10)
# 요소 추출
elements = driver.find_elements(By.CSS_SELECTOR, '.dynamic-element')
for element in elements:
print(element.text)
# 웹 브라우저 닫기
driver.quit()
```
#### 11.6 스크래핑 방지 대책
웹 사이트는 종종 스크래핑을 방지하기 위해 다양한 대책을 사용합니다. 이러한 대책에는 다음과 같은 것이 있습니다:
- **Robots.txt**: 사이트의 `robots.txt` 파일은 크롤러가 어떤 페이지를 크롤링할 수 있는지 지정합니다.
- **CAPTCHA**: 봇을 차단하기 위해 CAPTCHA를 사용합니다.
- **IP 차단**: 특정 IP 주소에서의 과도한 요청을 차단합니다.
웹 스크래핑을 할 때는 사이트의 이용 약관을 준수하고, 법적 문제를 피하기 위해 허용된 범위 내에서만 데이터를 추출해야 합니다.
#### 11.7 주의사항
웹 스크래핑을 할 때는 다음 사항을 주의해야 합니다:
- **법적 문제**: 웹 스크래핑은 법적 문제를 일으킬 수 있습니다. 사이트의 이용 약관을 준수하고, 허용된 범위 내에서 데이터를 추출해야 합니다.
- **예의**: 사이트의 서버에 과도한 부하를 주지 않도록 주의해야 합니다. 요청 간의 대기 시간을 설정하고, 필요한 데이터만 추출하도록 합니다.
- **데이터 품질**: 추출한 데이터의 품질을 검증하고, 필요한 경우 데이터 정제 작업을 수행해야 합니다.
이상으로, 파이썬에서 웹 스크래핑을 사용하는 방법에 대해 알아보았습니다. 다음 장에서는 데이터 시각화에 대해 더 자세히 알아보겠습니다. 질문이나 요청사항이 있으시면 댓글로 남겨주세요!
---
이 글의 내용은 GoalKicker.com의 Python Notes for Professionals 책을 참조하였습니다.
댓글
댓글 쓰기