파이썬으로 데이터 분석도 많이 하지만 웹 크롤링을 통해서도 많이 코딩을 합니다. 특히나, 웹 크롤링은 써먹을 때가 많습니다.
웹 크롤링은 웹 사이트에서 데이터를 자동으로 추출하는 기술입니다. 검색 엔진, 가격 비교 사이트, 뉴스 애그리게이터 등 다양한 응용 프로그램에 사용됩니다.
파이썬은 웹 크롤링에 유용한 여러 라이브러리를 제공하여 웹 개발자와 데이터 과학자들에게 인기 있는 언어입니다.
본 가이드에서는 파이썬으로 웹 크롤링 하는 방법을 자세히 설명합니다.
- 크롤링 프로세스 이해: 크롤링 프로세스의 단계와 각 단계에서 수행되는 작업에 대해 알아봅니다.
- 요구 사항 준비: 크롤링에 필요한 라이브러리, 도구 및 환경을 설치합니다.
- 요청 보내기: requests 라이브러리를 사용하여 웹 서버에 요청을 보내고 응답을 받는 방법을 학습합니다.
- HTML 파싱: Beautiful Soup 라이브러리를 사용하여 HTML 문서를 파싱하고 원하는 데이터를 추출하는 방법을 학습합니다.
- 데이터 처리: 추출된 데이터를 정제하고 저장하는 방법을 학습합니다.
- 고급 주제: JavaScript를 사용하는 웹 페이지 크롤링, 오류 처리, 프록시 사용 등 고급 주제를 다룹니다.
1. 크롤링 프로세스 이해
웹 크롤링 프로세스는 다음 단계로 구성됩니다.
- 목표 설정: 크롤링할 웹 사이트와 추출하려는 데이터를 명확히 정의합니다.
- 요청 보내기: 웹 서버에 요청을 보내고 HTML 문서를 포함하는 응답을 받습니다.
- HTML 파싱: HTML 문서를 구조화된 데이터로 파싱합니다.
- 데이터 추출: 원하는 데이터를 HTML 문서에서 추출합니다.
- 데이터 처리: 추출된 데이터를 정제하고 저장합니다.
2. 요구 사항 준비
필요한 라이브러리 설치:
- requests: 웹 서버에 요청을 보내고 응답을 받는 데 사용됩니다.
- Beautiful Soup: HTML 문서를 파싱하고 원하는 데이터를 추출하는 데 사용됩니다.
- (선택 사항) Selenium: JavaScript를 사용하는 웹 페이지를 크롤링하는 데 사용됩니다.
설치 방법:
pip install requests beautifulsoup4 [selenium]
3. 요청 보내기
requests 라이브러리 사용:
requests.get()
함수를 사용하여 웹 서버에 GET 요청을 보냅니다.requests.post()
함수를 사용하여 웹 서버에 POST 요청을 보냅니다.response.status_code
속성을 사용하여 요청 응답의 상태 코드를 확인합니다.response.content
속성을 사용하여 응답 본문을 가져옵니다.
예제:
import requests
# 네이버 뉴스 검색 URL
url = "https://search.naver.com/search.naver?where=news&query=파이썬"
# URL 요청 및 응답 받기
response = requests.get(url)
# 응답 상태 코드 확인
if response.status_code == 200:
# 응답 본문 출력
print(response.content.decode('utf-8'))
else:
print("요청 오류:", response.status_code)
4. HTML 파싱
Beautiful Soup 라이브러리 사용:
BeautifulSoup()
함수를 사용하여 HTML 문서를 파싱합니다.– 파싱: *프로그래밍 언어로 짠 코드를 실행하거나, 프로그램으로 변환시키 위해서는 어휘 분석(lexing) 또는 토큰화(tokenize)를 통해 키워드, 식별자(Identifier), 연산자(Operator) 및
리터럴(Literal) 같은 개별 토큰으로 변환한다. 이후 이 코드가 프로그래밍 언어의 문법에 맞는지 확인하는 과정을 파싱(parsing)이라고 한다.find()
함수,find_all()
함수,select()
함수 등을 사용하여 원하는 HTML 요소를 찾습니다.text
속성을 사용하여 HTML 요소의 텍스트 콘텐츠를 추출합니다.attrs
속성을 사용하여 HTML 요소의 속성 값을 추출합니다.
예제:
from bs4 import BeautifulSoup
# HTML 문서 파싱
soup = BeautifulSoup(response.content
5. 데이터 추출
Beautiful Soup를 사용한 데이터 추출:
- 추출하려는 데이터가 포함된 HTML 요소를 찾습니다.
text
속성을 사용하여 텍스트 콘텐츠를 추출합니다.attrs
속성을 사용하여 속성 값을 추출합니다.
예제:
# 뉴스 기사 제목 추출
news_titles = soup.find_all('a', class_='news_tit')
for news_title in news_titles:
print(news_title.text)
# 뉴스 기사 링크 추출
news_links = [news_title['href'] for news_title in news_titles]
for news_link in news_links:
print(news_link)
예제:
# 뉴스 기사 제목 추출 (XPath)
news_titles = soup.find_all('a', attrs={'class': 'news_tit'})
for news_title in news_titles:
print(news_title.text)
# 뉴스 기사 요약 추출 (XPath)
news_summaries = soup.find_all('p', attrs={'class': 'news_dsc'})
for news_summary in news_summaries:
print(news_summary.text)
6. 데이터 처리
- 데이터 정제:
- 불필요한 공백, 문자 제거
- 특수 문자 처리
- HTML 태그 제거
- 데이터 형식 변환
- 데이터 저장:
- CSV 파일, JSON 파일, 데이터베이스 등에 저장
예제:
import csv
# CSV 파일에 저장
with open('news_data.csv', 'w', encoding='utf-8') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['제목', '링크', '요약'])
for news_title, news_link, news_summary in zip(news_titles, news_links, news_summaries):
writer.writerow([news_title, news_link, news_summary])
7. 고급 주제
JavaScript를 사용하는 웹 페이지 크롤링:
- Selenium 라이브러리를 사용하여 웹 브라우저를 자동으로 제어하고 JavaScript를 실행합니다.
- AJAX 요청을 처리하고 동적으로 로드되는 데이터를 추출합니다.
오류 처리:
- 예외 처리를 사용하여 예상치 못한 오류를 처리합니다.
- HTTP 상태 코드를 확인하여 요청 오류를 감지합니다.
- 재시도 전략을 사용하여 요청 실패를 처리합니다.
프록시 사용:
- 프록시 서버를 사용하여 IP 주소를 숨기고 크롤링 제한을 우회합니다.
API 사용:
- 일부 웹 사이트는 데이터 추출을 위한 API를 제공합니다. API를 사용하면 더 쉽고 효율적으로 데이터를 얻을 수 있습니다.
8. 마무리
파이썬은 웹 크롤링을 수행하는 데 강력하고 유연한 도구입니다. requests, Beautiful Soup, Selenium과 같은 다양한 라이브러리를 활용하여 다양한 웹 사이트에서 데이터를 추출할 수 있습니다.
본 가이드에서 소개한 내용을 바탕으로 실제 웹 크롤링 프로젝트를 진행해 보시고, 필요에 따라 더 많은 정보를 검색하시기 바랍니다.
주의: 웹 크롤링은 웹사이트 운영자의 동의 없이 진행해서는 안 됩니다. 대부분의 웹사이트에는 robots.txt 파일이 있어 크롤링이 허용되는지 여부를 확인할 수 있습니다. 또한, 웹 크롤링은 웹사이트에 과도한 부하를 줄 수 있으므로, 너무 많은 요청을 보내지 않도록 주의해야 합니다. 마지막으로, 웹 크롤링을 통해 얻은 데이터는 개인정보 보호법 등을 준수하여 사용해야 합니다.