파이썬으로 웹 스크래핑 시작하기
어느 화창한 수요일 오전, ‘지수’는 커피 잔을 손에 든 채로 오늘의 새 도전을 떠올렸습니다. “지난번에는 데이터 분석을 배웠으니, 이번에는 웹에서 유용한 데이터를 직접 모아보자!” 이렇게 시작된 이야기, 오늘은 “파이썬으로 웹 스크래핑 시작하기” 여정을 함께 걸어볼게요.
🕸️ 1. 웹 스크래핑이란?
웹 스크래핑(Web Scraping)은 사람처럼 브라우저를 통해 정보를 보는 대신, 파이썬 코드로 자동으로 웹페이지의 데이터를 가져오는 기술입니다. 뉴스 기사, 상품 가격, 공공 데이터 등 우리가 눈으로 보는 모든 웹 콘텐츠를 손쉽게 수집할 수 있어요.
지수의 깨달음
“스크래핑은 정보 수집의 마법! 반복적이고 번거로운 클릭을 코드 한 줄로 해결할 수 있죠.”
⚙️ 2. 준비: 라이브러리 설치
웹 스크래핑의 기본 도구는 requests와 BeautifulSoup입니다.
pip install requests beautifulsoup4
- requests: HTTP 요청을 보내 웹페이지 소스 코드를 가져옴
- beautifulsoup4: HTML을 파싱해 원하는 정보를 쉽게 추출
🚀 3. 기본 흐름 잡기
- HTTP 요청: requests.get()으로 페이지 요청
- HTML 파싱: BeautifulSoup으로 문서 구조화
- 데이터 추출: 태그·클래스·속성 기반으로 원하는 내용 꺼내기
- 저장: CSV, JSON, 데이터베이스 등으로 내보내기
import requests
from bs4 import BeautifulSoup
url = 'https://example.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
🔍 4. 실전 예제: 뉴스 제목 크롤링
지수는 IT 뉴스 홈페이지에서 최신 기사 제목만 뽑아보기로 했습니다.
import requests
from bs4 import BeautifulSoup
# 1. 페이지 요청
url = 'https://news.example.com/tech'
resp = requests.get(url)
resp.raise_for_status() # 오류 시 예외 발생
# 2. 파싱
soup = BeautifulSoup(resp.text, 'html.parser')
# 3. 제목 요소 찾기 (예:
) titles = soup.select('h2.title') # 4. 텍스트만 추출 for idx, title in enumerate(titles, 1): print(f"{idx}. {title.get_text(strip=True)}")
실습 팁
- resp.raise_for_status()로 HTTP 오류(404, 500 등)를 사전에 잡아내세요.
- select()에 CSS 선택자를 활용하면 더 유연하게 요소를 찾을 수 있습니다.
🔄 5. 페이지 넘기기(Pagination)
여러 페이지에 걸쳐 데이터를 모으려면 URL 패턴을 파악해야 합니다. 예를 들어, 페이지 번호가 URL 뒤에 ?page=2 형태로 붙는다면:
all_titles = []
for page in range(1, 6): # 1페이지부터 5페이지까지
url = f'https://news.example.com/tech?page={page}'
resp = requests.get(url)
soup = BeautifulSoup(resp.text, 'html.parser')
titles = soup.select('h2.title')
all_titles += [t.get_text(strip=True) for t in titles]
print(f"총 수집한 기사 개수: {len(all_titles)}")
지수의 깨달음
“반복문 하나로 수십 페이지도 순식간에 처리할 수 있네요!”
🔒 6. 주의할 점: 로봇 배제 표준(robots.txt)
스크래핑 전에 해당 사이트의 https://도메인/robots.txt를 확인해 허용된 경로만 크롤링하세요.
User-agent: *
Disallow: /private/
위 예시처럼 /private/는 크롤러 접근 금지 구역입니다. 규칙을 지켜야 법적·윤리적 분쟁을 피할 수 있어요.
💾 7. 데이터 저장하기
추출한 데이터를 CSV로 저장해 보겠습니다.
import csv
with open('tech_titles.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['번호', '제목'])
for idx, title in enumerate(all_titles, 1):
writer.writerow([idx, title])
print("CSV 파일 저장 완료!")
이제 tech_titles.csv를 열어보면, 깔끔하게 정리된 기사 목록을 볼 수 있어요.
✨ 8. 한 단계 더: 동적 페이지 크롤링
JavaScript로 동적 로딩되는 페이지는 requests만으로는 불완전할 수 있습니다. 이때는 Selenium을 사용해 실제 브라우저를 제어하거나, API 요청을 분석해 직접 데이터를 받아오는 방법을 택할 수 있죠.
pip install selenium
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://dynamic.example.com')
elements = driver.find_elements_by_css_selector('div.item')
for e in elements:
print(e.text)
driver.quit()
🎯 9. 마무리 & 다음 포스팅 예고
오늘은 지수와 함께 파이썬 웹 스크래핑의 기초를 다뤄봤습니다.
- requests로 페이지 요청
- BeautifulSoup으로 HTML 파싱
- 반복문으로 여러 페이지 크롤링
- 저장 및 로봇 배제 표준 준수
다음 포스팅에서는 “파이썬으로 데이터 시각화 다지기”를 준비 중이니, 직접 스크래핑한 데이터를 들고 와서 함께 그림을 그려봐요. 그럼 곧 만나요! 🚀