파이썬 웹 스크래핑 기초: Requests와 BeautifulSoup 실행 예제
Requests는 HTTP 응답을 가져오고 BeautifulSoup은 받은 HTML에서 필요한 요소를 선택합니다. 두 도구는 브라우저에서 실행되는 자바스크립트를 자동으로 실행하지 않습니다.
인터넷 요청 없이 선택자부터 시험하기
처음에는 작은 HTML로 추출 규칙을 확인하는 편이 좋습니다. Python 3에서 python -m pip install requests beautifulsoup4로 패키지를 설치하세요. 다음 예제는 외부 사이트를 요청하지 않습니다.
from bs4 import BeautifulSoup
html = '''<ul id="reports">
<li><a href="/report/1">월간 보고서</a></li>
<li><a href="/report/2">주간 보고서</a></li>
</ul>'''
soup = BeautifulSoup(html, "html.parser")
rows = [
{"title": a.get_text(strip=True), "path": a.get("href")}
for a in soup.select("#reports li a[href]")
]
assert len(rows) == 2
assert rows[0]["title"] == "월간 보고서"
print(rows)
#reports li a[href]는 지정된 목록 안에서 href 속성이 있는 링크만 선택합니다. 선택 결과가 빈 목록이면 곧바로 파일을 덮어쓰기보다, 페이지 구조 변경 또는 잘못된 선택자인지 먼저 확인하세요.
허용된 페이지에 요청 연결하기
대상 사이트가 공식 API나 CSV를 제공하면 그것을 우선 검토하세요. HTML 수집이 허용된 경우에는 아래와 같이 시간 제한과 응답 코드 확인을 넣습니다. URL은 예시이므로 실제 사용 권한이 있는 주소로 바꿔야 합니다.
import requests
url = "https://example.com/"
response = requests.get(url, timeout=(5, 20))
response.raise_for_status()
soup = BeautifulSoup(response.content, "html.parser")
title = soup.title.get_text(strip=True) if soup.title else "제목 없음"
print(title)
연결과 읽기 타임아웃은 요청 전체의 고정된 최대 실행 시간과 같은 개념이 아닙니다. 시간 초과나 HTTP 오류는 해당 예외를 구분해 처리하세요. 오류 응답의 HTML을 정상 데이터로 저장하지 않는 것이 중요합니다.
화면에는 있는데 응답 HTML에는 없을 때
자바스크립트로 나중에 표시되는 데이터일 수 있습니다. 공식 API를 확인하고, 허용된 브라우저 자동화가 필요하다면 Selenium 같은 도구를 검토하세요. User-Agent를 바꾼다고 권한이나 이용약관 제한이 없어지는 것은 아닙니다.
공식 자료: Requests Quickstart, Beautiful Soup 문서. 관련 글: 수집 결과 저장, 텍스트 정리, 웹 스크래핑 가이드.
작성: 로그 · 2026-10-17 수정: 로컬 HTML 예제와 요청 실패 검증 절차를 추가했습니다.
댓글
댓글 쓰기