본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] BeautifulSoup 완전 안내 : 웹 크롤링의 핵심 요소

by Papa Martino V 2025. 7. 22.
728x90

BeautifulSoup 완전 안내 : 웹 크롤링의 핵심 요소
[PYTHON] BeautifulSoup

 

웹 데이터를 자동으로 수집하고 분석하려면 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의 활용성을 직접 경험해보세요.

참고 출처

728x90