Python 웹 스크래핑 기초부터 실전까지
1. 웹 스크래핑(Web Scraping)이란?
우리는 웹 페이지에서 다양한 정보를 얻습니다.
이 정보를 자동으로 가져와서 정리하는 작업을 웹 스크래핑(Web Scraping)이라고 합니다.
웹 스크래핑은 크게 두 가지 과정으로 나눌 수 있습니다.
- 크롤링(Crawling): 웹 페이지의 전체 데이터를 가져오는 과정
- 스크래핑(Scraping): 가져온 데이터에서 원하는 정보만 추출하는 과정
웹 스크래핑은 데이터를 수집하여 데이터베이스(DB)에 저장하고, 이후 다양한 용도로 활용하는 데 사용됩니다.
2. Python으로 웹 크롤링하기
Python은 웹 크롤링에 적합한 다양한 라이브러리를 제공합니다.
이번에는 Requests와 BeautifulSoup 라이브러리를 사용하여 데이터를 가져오는 방법을 알아보겠습니다.
2-1. 웹 크롤링을 위한 준비
웹 크롤링은 HTML로 작성된 웹 페이지에서 데이터를 가져오는 과정이므로, Python에서 HTTP 요청을 보내고 데이터를 처리하는 라이브러리가 필요합니다.
설치할 라이브러리
- requests: 웹 페이지 데이터를 가져오기 위한 라이브러리
- beautifulsoup4: 가져온 데이터에서 필요한 정보를 추출하는 라이브러리
라이브러리 설치 (가상환경 사용 권장)
pip install requests beautifulsoup4
설치가 완료되면, Python에서 다음과 같이 라이브러리를 불러올 수 있습니다.
import requests
from bs4 import BeautifulSoup
2-2. 웹 페이지 데이터 가져오기
이제 웹 페이지에서 데이터를 가져오는 코드를 작성해보겠습니다.
import requests
url = "https://www.melon.com/chart/" # 크롤링할 웹사이트 주소
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
}
response = requests.get(url, headers=headers)
print(response.text) # HTML 코드 출력
위 코드를 실행하면 웹 페이지의 HTML 소스 코드가 출력됩니다.
하지만 이 상태에서는 원하는 데이터만 추출하기 어렵기 때문에 BeautifulSoup을 활용하여 특정 데이터를 가져오는 작업을 진행해야 합니다.
2-3. BeautifulSoup으로 HTML 분석하기
BeautifulSoup을 사용하면 HTML 구조에서 원하는 요소를 쉽게 찾아낼 수 있습니다.
코드 예제:
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, "html.parser") # HTML 파싱
print(soup.prettify()) # HTML 구조를 보기 좋게 출력
2-4. 원하는 데이터 추출하기
이제 Melon 차트에서 TOP 100 음악의 순위, 제목, 가수를 가져와 보겠습니다.
1) 원하는 태그 선택하기
개발자 도구에서 원하는 데이터를 찾아 CSS 선택자(Selector)를 복사합니다.
예를 들어,
- 순위: span.rank
- 제목: div.ellipsis.rank01 > span > a
- 가수: div.ellipsis.rank02 > a
2) Python 코드 작성하기
import requests
from bs4 import BeautifulSoup
url = "https://www.melon.com/chart/"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, "html.parser")
# 순위, 제목, 가수 정보 가져오기
songs = soup.select("tr")
for song in songs:
rank = song.select_one("span.rank")
title = song.select_one("div.ellipsis.rank01 > span > a")
artist = song.select_one("div.ellipsis.rank02 > a")
if rank and title and artist:
print(f"{rank.text}. {artist.text} - {title.text}")
출력 예시:
1. 아이유 - Love wins all
2. 뉴진스 - Super Shy
3. 방탄소년단 - Dynamite
4. 아이브 - After LIKE
...
이제 TOP 100 차트의 정보를 자동으로 가져올 수 있습니다.
3. 웹 스크래핑을 응용하는 방법
웹 스크래핑은 다양한 용도로 활용될 수 있습니다.
✅ 실시간 뉴스 수집: 주요 뉴스 사이트에서 최신 뉴스를 자동으로 가져와서 분석
✅ 주식 데이터 수집: 특정 종목의 실시간 주가 정보 가져오기
✅ 상품 가격 비교: 쇼핑몰에서 동일 제품의 가격을 비교하여 최저가 찾기
✅ 자동 데이터 업데이트: 매일 특정 데이터를 가져와서 업데이트하는 프로그램 만들기
웹 스크래핑을 활용하면 데이터를 자동으로 수집하고 활용할 수 있기 때문에, 여러 분야에서 유용하게 사용할 수 있습니다.
4. 웹 스크래핑 시 주의할 점
웹 스크래핑을 진행할 때는 법적 문제와 기술적인 제약을 고려해야 합니다.
1) robots.txt 확인
웹 사이트마다 robots.txt 파일을 통해 크롤링 허용 여부를 지정합니다.
크롤링을 하기 전에 https://www.melon.com/robots.txt와 같은 주소를 확인해 보세요.
2) 요청 제한 (Rate Limiting)
짧은 시간 동안 너무 많은 요청을 보내면 IP 차단이 될 수 있습니다.
따라서 time.sleep(1)과 같은 코드를 활용하여 적절한 시간 간격을 두고 요청하는 것이 좋습니다.
3) API 활용 고려
일부 웹사이트는 공식 API를 제공합니다.
가능하면 API를 활용하는 것이 법적, 기술적으로 더 안전한 방법입니다.
마무리하며
이번 글에서는 Python을 활용한 웹 스크래핑 기초를 다뤘습니다.
- 웹 스크래핑이 무엇인지
- Python으로 웹 데이터를 가져오는 방법
- BeautifulSoup을 사용하여 원하는 정보를 추출하는 방법
이제 이를 응용하여 자신만의 데이터를 수집하고 분석하는 프로그램을 만들어볼 수 있습니다.
다음에는 수집한 데이터를 저장하고 활용하는 방법도 다뤄보겠습니다!