한줄 요약:
파이썬으로 웹 페이지 데이터를 자동으로 가져오는 프로그램 만들기!
👉 requests + BeautifulSoup으로 뉴스, 상품 정보, 블로그 글 등 쉽게 크롤링하자 🕵️♂️
1. 목표
requests로 웹페이지 HTML 소스 요청하기BeautifulSoup으로 HTML 문서에서 원하는 데이터 추출- 반복문으로 여러 페이지 자동 크롤링
- CSV 파일로 저장
2. 준비하기
1️⃣ 필요한 패키지 설치
pip install requests beautifulsoup4
2️⃣ 크롤링 대상 예시
이번 예제에서는 뉴스 목록 페이지를 예시로 사용하자.
URL 구조 예시:
https://example.com/news?page=1
페이지 번호만 바꿔가며 여러 페이지의 뉴스 제목을 가져온다고 생각해보자.
3. 기본 코드 예시
import requests
from bs4 import BeautifulSoup
# 1️⃣ URL 지정
url = "https://example.com/news?page=1"
# 2️⃣ 요청 보내기
response = requests.get(url)
response.raise_for_status() # 오류 발생 시 예외
# 3️⃣ HTML 파싱
soup = BeautifulSoup(response.text, "html.parser")
# 4️⃣ 데이터 추출 (예: 뉴스 제목)
titles = soup.select("h2.title") # CSS 선택자 사용
for idx, t in enumerate(titles, 1):
print(f"{idx}. {t.get_text(strip=True)}")
4. 코드 설명
| 단계 | 기능 |
|---|---|
requests.get() | URL로 요청 보내기 |
raise_for_status() | HTTP 오류 시 예외 발생 |
BeautifulSoup() | HTML 파싱 도구 |
.select() | CSS 선택자 방식으로 원하는 태그 찾기 |
.get_text(strip=True) | HTML 태그 제거하고 텍스트만 추출 |
5. 여러 페이지 자동 크롤링
import requests
from bs4 import BeautifulSoup
base_url = "https://example.com/news?page="
all_titles = []
for page in range(1, 6): # 1~5페이지
url = f"{base_url}{page}"
res = requests.get(url)
res.raise_for_status()
soup = BeautifulSoup(res.text, "html.parser")
titles = soup.select("h2.title")
for t in titles:
all_titles.append(t.get_text(strip=True))
print(f"총 {len(all_titles)}개의 뉴스 수집 완료!")
6. CSV 파일로 저장
import csv
with open("news_titles.csv", "w", newline="", encoding="utf-8-sig") as f:
writer = csv.writer(f)
writer.writerow(["번호", "뉴스 제목"])
for i, title in enumerate(all_titles, 1):
writer.writerow([i, title])
print("✅ news_titles.csv 파일로 저장 완료!")
7. 실전 크롤링 예시: 네이버 뉴스
⚠️ 주의: 크롤링 시 사이트 이용 약관을 반드시 확인하고, 너무 잦은 요청은 피하세요.
import requests
from bs4 import BeautifulSoup
headers = {"User-Agent": "Mozilla/5.0"} # 브라우저 흉내내기
url = "https://news.naver.com/section/101" # 경제 뉴스
res = requests.get(url, headers=headers)
res.raise_for_status()
soup = BeautifulSoup(res.text, "html.parser")
titles = soup.select("div.sa_text > a.sa_text_title")
for t in titles:
print(t.get_text(strip=True))
🪄 팁:
headers추가 시 봇 차단을 피할 수 있음- CSS 선택자는 Chrome → 검사(F12) → 태그 우클릭 → Copy → Copy selector 로 찾을 수 있음
8. 크롤링 예외 처리 (에러 방지 필수!)
import time
import random
for page in range(1, 6):
try:
url = f"{base_url}{page}"
res = requests.get(url, timeout=5)
res.raise_for_status()
soup = BeautifulSoup(res.text, "html.parser")
print(f"{page}페이지 처리 완료")
except Exception as e:
print(f"{page}페이지 에러 발생: {e}")
time.sleep(random.uniform(1, 3)) # 요청 간 간격 두기
9. 크롤링 데이터 활용
- 엑셀/CSV 분석: pandas로 불러서 정리
- 워드클라우드: 텍스트 빈도 시각화
- 자동 요약/분류 모델 학습: 머신러닝 데이터로 활용 가능
10. 주의사항
| 항목 | 설명 |
|---|---|
| robots.txt 확인 | 사이트가 허용하는 경로만 크롤링 |
| 과도한 요청 금지 | sleep으로 요청 간격 조절 |
| 저작권 주의 | 뉴스 본문 등은 상업적 이용 금지 |
| API 제공 여부 확인 | 공식 API가 있다면 그쪽이 안전하고 효율적 |
11. 최종 점검 체크리스트
- requests + BeautifulSoup 설치 완료
.select()로 태그 정확히 선택- 여러 페이지 자동 반복 처리
- CSV 저장 테스트 완료
- robots.txt, 이용 약관 준수
12. 요약 한 줄
웹 크롤링은 데이터 수집의 핵심 기술!
requests로 가져오고,BeautifulSoup으로 정리하고, CSV로 저장하자 ✅
이전 강좌 👈 [도구/환경#6] 파이썬 성능 최적화 (속도 개선 팁)
다음 강좌 👉 [응용#2] Selenium으로 동적 페이지 자동 크롤링