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 책을 참조하였습니다.

댓글