728x90

웹 데이터를 자동으로 수집하고 분석하려면 BeautifulSoup이 가장 널리 쓰이는 도구입니다. HTML 구조를 이해하고, 태그 기반으로 원하는 정보를 효율적으로 추출할 수 있어, 실전 웹 크롤링에서 매우 중요한 역할을 합니다. 본 글에서는 기본 이해부터 고급 활용, 안정화 전략까지 전문가 수준의 관점으로 정리하였습니다.
1. BeautifulSoup 소개
- Python 기반 HTML/XML 파싱 라이브러리
- requests와 함께 사용하면 웹 데이터를 쉽게 수집 가능
- HTML 문서를 파싱하여 DOM 트리로 변환
- CSS 선택자 또는 태그/속성 접근 방식 지원
2. 설치 및 초기 설정
pip install requests beautifulsoup4
설치 후, requests로 페이지 요청하고 BeautifulSoup으로 파싱합니다.
import requests
from bs4 import BeautifulSoup
res = requests.get("https://example.com")
soup = BeautifulSoup(res.text, "html.parser")
3. 주요 HTML 요소 추출 비교
| 기능 | 방법 | 예시 코드 |
|---|---|---|
| 태그 찾기 | find(), find_all() |
soup.find('h1') |
| CSS 선택자 | select() |
soup.select('div.content a') |
| 텍스트 추출 | .text, .get_text() |
tag.get_text(strip=True) |
| 속성값 접근 | ['href'] |
a['href'] |
4. 실전 예제: 뉴스 제목 모으기
url = "https://news.ycombinator.com/"
res = requests.get(url)
soup = BeautifulSoup(res.text, "html.parser")
titles = soup.select(".titleline a")
for tag in titles:
print(tag.get_text(), "-", tag['href'])
5. 동적 페이지 대응 (JavaScript 렌더링)
JavaScript로 생성되는 콘텐츠는 requests + BeautifulSoup만으로 수집할 수 없습니다. 이때는 Selenium, Playwright 또는 사이트의 API 직접 호출이 필요합니다.
# Selenium 연동 예시
from selenium import webdriver
from bs4 import BeautifulSoup
driver = webdriver.Chrome()
driver.get("https://example.com")
html = driver.page_source
soup = BeautifulSoup(html, "html.parser")
driver.quit()
6. 에러 대응 및 안정화 팁
- HTTP 오류 대응:
res.raise_for_status()사용 - 접속 제한 회피: 헤더/쿠키 세팅, 인위적 대기, User-Agent 설정
- 지연 로드 대응:
time.sleep()또는 WebDriverWait - 반복 작업 시 지연, IP 회전, 프록시 활용
7. BeautifulSoup vs 다른 도구 비교
| 도구 | 장점 | 한계 |
|---|---|---|
| BeautifulSoup | 간단한 HTML 파싱, 비교적 빠름 | 동적 콘텐츠 처리 불가 |
| Selenium / Playwright | JS 렌더링 포함 브라우저 자동화 가능 | 느릴 수 있음, 리소스 소모 많음 |
| Scrapy | 대규모 크롤링에 최적화, 병렬 처리 | 학습 곡선 있음, 초기 구조 설계 필요 |
8. 데이터 정제 및 저장
import csv
items = []
for tag in soup.select("ul.list li"):
title = tag.get_text(strip=True)
link = tag.a['href']
items.append({'title': title, 'link': link})
with open("data.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["title","link"])
writer.writeheader()
writer.writerows(items)
9. 법적/윤리적 유의사항
- robots.txt 준수
- 사이트 이용 약관 확인
- 과도한 요청은 서버에 부하를 줄 수 있음
- 개인정보가 포함된 크롤링은 법적 책임 발생 가능
10. 결론: BeautifulSoup은 크롤링의 시작점
BeautifulSoup은 웹 데이터를 단순하고 효과적으로 추출할 수 있는 도구입니다. requests와 함께 GSM 수준의 크롤러를 빠르게 만들 수 있으며, 고급 기능은 Selenium, Scrapy 등의 도구와 결합해 사용하면 더욱 강력해집니다. 이 글을 통해 BeautifulSoup의 활용성을 직접 경험해보세요.
참고 출처
- Beautiful Soup 공식 문서: https://www.crummy.com/software/BeautifulSoup/bs4/doc/
- Requests 공식 문서
- Web Scraping with Python – Ryan Mitchell
728x90
'Artificial Intelligence > 60. Python' 카테고리의 다른 글
| [PYTHON] datetime 모듈 완전 가이드: 날짜와 시간을 자유자재로 (0) | 2025.07.22 |
|---|---|
| [PYTHON] Regex 완전 정복 : 정규표현식으로 문자열 다루기 (0) | 2025.07.22 |
| [PYTHON] requests 라이브러리 완전 정복 : HTTP 요청을 간단하게 (0) | 2025.07.22 |
| [PYTHON] Selenium으로 웹을 자동화하는 모든 방법 (0) | 2025.07.22 |
| [PYTHON] PyTorch 완전 가이드 : 직관적이고 강력한 딥러닝 프레임워크 (0) | 2025.07.21 |