![[파이썬 09] 웹 크롤링 기초](https://img.thenullpage.com/posts/5387/5387_1_03ffc4.webp)
웹사이트에 있는 정보를 손으로 하나씩 복사하는 대신 자동으로 가져오는 작업을 웹 크롤링(혹은 스크래핑)이라고 한다. 파이썬에서는 requests 라이브러리로 웹페이지 내용을 가져오고, BeautifulSoup 라이브러리로 그 내용을 원하는 형태로 파싱하는 조합이 표준처럼 쓰인다.
1. 크롤링의 기본 원리, 3단계
웹 크롤링은 크게 세 단계로 이뤄진다. 먼저 requests 라이브러리로 웹페이지의 HTML 내용을 요청해서 가져오고, 그 HTML 구조를 분석해서 원하는 데이터가 어느 태그 안에 있는지 파악한 다음, BeautifulSoup으로 해당 태그를 찾아 데이터를 추출해 파이썬 리스트나 딕셔너리에 담는다. 설치는 다음과 같다.
pip install requests beautifulsoup4
2. 웹페이지 가져오기
import requests
url = "https://example.com"
response = requests.get(url)
print(response.text) # HTML 원본 내용 출력
이때 일부 사이트는 봇으로 보이는 요청을 차단하기 때문에 403 Forbidden 오류가 뜰 수 있는데, 이런 경우 실제 브라우저처럼 보이도록 User-Agent 헤더를 함께 보내면 해결되는 경우가 많다.
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
response = requests.get(url, headers=headers)
3. HTML 파싱해서 원하는 데이터 뽑기
가져온 HTML을 BeautifulSoup에 넘기면 태그 구조를 파이썬 객체처럼 탐색할 수 있게 된다.
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, 'html.parser')
print(soup.prettify()) # 보기 좋게 정렬된 HTML 출력
원하는 요소를 찾을 땐 find()(첫 번째로 일치하는 요소 하나)와 find_all()(일치하는 모든 요소를 리스트로) 두 메서드를 주로 쓴다.
titles = soup.find_all('h2', class_='title')
for title in titles:
print(title.text.strip())
4. 실전 예제, 목록형 데이터 뽑아서 정리하기
뉴스 목록이나 상품 목록처럼 반복되는 구조를 가진 페이지에서는, 각 항목을 감싸는 상위 태그를 먼저 찾은 뒤 그 안에서 필요한 정보(제목, 링크, 날짜 등)를 각각 추출해 딕셔너리로 묶는 방식이 일반적으로 쓰인다.
import requests
from bs4 import BeautifulSoup
url = "https://example.com/news"
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
articles = soup.find_all('div', class_='article-card')
results = []
for article in articles:
title = article.find('h2').text.strip()
link = article.find('a')['href']
results.append({"제목": title, "링크": link})
for r in results:
print(r)
앞서 다룬 "리스트 안에 딕셔너리" 패턴이 여기서도 그대로 쓰이는 걸 볼 수 있다. 크롤링해서 모은 데이터를 결국 이런 구조로 정리한 뒤, 앞서 배운 엑셀 자동화나 이후 다룰 데이터 분석 편으로 이어서 활용하게 된다.
5. 크롤링할 때 지켜야 할 것들
크롤링은 도구 자체로는 합법이지만, 실제로 허용되는지는 각 웹사이트의 이용약관과 데이터 사용 방식에 따라 달라진다는 점을 유의해야 한다. 사이트 루트에 있는 robots.txt 파일에 크롤링 허용/차단 규칙이 명시된 경우가 많으므로, 크롤링 전에 이 파일을 먼저 확인하는 것이 권장된다. 또한 사람이 아니라 스크립트가 짧은 시간에 수천 번 요청을 보내면 상대 서버에 과부하를 줄 수 있으므로, 페이지 하나당 요청은 한 번만 하고 필요하면 로컬에 저장해서 재사용하는 방식으로 서버 부담을 줄이는 게 일반적인 매너로 꼽힌다.
6. 정리
크롤링은 requests로 HTML을 가져오고, BeautifulSoup으로 원하는 부분만 골라내는 두 단계 조합이 기본이다. 다만 사이트마다 구조가 다르고 차단 정책도 다르기 때문에, robots.txt 확인과 User-Agent 설정, 요청 빈도 조절 같은 기본 매너를 지키는 게 실무에서 중요하게 다뤄진다.