[Python] 파이썬 웹 크롤링 하는법 & 간단 예제
- Language/Python
- 2023. 11. 28.
웹 크롤링(Web Crawling)은 웹 사이트를 자동으로 서치하고 데이터를 수집하는 프로세스를 뜻합니다. 그리고 이 웹 크롤링은 파이썬이 강점을 가지고 있습니다. 파이썬이 웹 크롤링에 필요한 여러 가지 라이브러리와 풍부한 생태계를 갖추고 있기 때문입니다. 그중에서도 requests와 BeautifulSoup 라이브러리를 많이 사용하는데요. 이번 포스팅에서는 이 라이브러리를 사용하여 크롤링하는 방법에 대해 알아보도록 하겠습니다.
파이썬에서 웹 크롤링 하는 법
라이브러리 다운로드(requests, beautifulsoup)
일반적으로 파이썬 웹 크롤링은 requests 라이브러리를 사용하여 웹 페이지의 HTML을 가지고 오고, beautifulsoup를 사용하여 HTML코드를 사용하기 쉽게 나눠주는 파싱이라는 과정을 거쳐서 사용하게 됩니다. 이 라이브러리 두 개가 핵심적인 역할을 하고 있기 때문에 requests, beautifulsoup 모듈이 설치되어 있지 않다면 먼저 설치해 주도록 합시다.
pip install requests
pip install beautifulsoup4
명령 프롬프트 CMD창을 켠 뒤 위의 명령어를 실행시켜 라이브러리를 다운로드하시면 됩니다.
웹 크롤링 순서
- URL 추출: 먼저 타깃 URL을 선택하고 크롤러를 통해 페이지의 HTML을 다운로드합니다. 그 후 HTML에서 다른 링크를 추출하여 다음에 방문할 페이지를 설정합니다.
- 웹 페이지 다운로드: 크롤러가 설정한 URL로 이동하고 해당 페이지의 HTML을 다운로드합니다. 이때, HTTP 요청을 통해 서버로부터 페이지의 데이터를 받아오게 됩니다.
- HTML 파싱: 다운로드를 완료한 HTML에서 필요한 정보를 추출하기 위해 데이터를 파싱 하는 작업을 진행합니다. 일반적으로는 BeautifulSoup 라이브러리를 사용합니다.
- 데이터 추출: 파싱을 완료한 HTML에서 원하는 데이터를 추출합니다.
- 데이터 저장 또는 활용: 추출한 데이터를 원하는 형식으로 저장하거나, 분석 등 다양한 용도로 활용합니다.
웹 크롤링 예제
from bs4 import BeautifulSoup
import urllib.request
import re
#User-Agent를 조작하는 경우(아이폰에서 사용하는 사파리 브라우져의 헤더)
hdr = {'User-agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/603.1.23 (KHTML, like Gecko) Version/10.0 Mobile/14E5239e Safari/602.1'}
for n in range(0,10):
#클리앙의 중고장터 주소
data ='https://www.clien.net/service/board/sold?&od=T31&po=' + str(n)
#웹브라우져 헤더 추가
req = urllib.request.Request(data, \
headers = hdr)
data = urllib.request.urlopen(req).read()
page = data.decode('utf-8', 'ignore')
soup = BeautifulSoup(page, 'html.parser')
list = soup.find_all('span',
attrs={'data-role':'list-title-text'})
for item in list:
try:
title = item.text.strip()
#print(title) # 클리앙 글 출력
if (re.search('아이패드', title)): # 아이패드에 관련된 글만 출력
print(title.strip())
except:
pass
간단한 예시로 클리앙이라는 사이트의 중고장터에서 데이터를 크롤링하여 아이패드 관련 제목을 출력하는 소스코드를 짜보았습니다. 아래에 소스코드 구문 분석을 통해 위의 소스코드를 자세히 설명할 테니 참고하셔서 여러분들이 데이터를 가지고 와야 할 사이트를 크롤링해 보시기 바랍니다.
소스코드 구문 해석
라이브러리 가져오기
from bs4 import BeautifulSoup
import urllib.request
import re
먼저 크롤링에 필요한 라이브러리를 import 하도록 하겠습니다.
사용자 에이전트 헤더 설정하기
hdr = {'User-agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/603.1.23 (KHTML, like Gecko) Version/10.0 Mobile/14E5239e Safari/602.1'}
최근에는 무분별한 크롤링과 서버 과부하를 막기 위해 사람이 직접 접속한 게 아니라 프로그램을 통하여 접속하는 것을 차단하는 사이트들이 많습니다. 클리앙이라는 사이트도 그중 하나죠. 그래서 우리는 user-agnet를 조작하여 iPhone 유저인 것처럼 속여서 차단을 우회하도록 하겠습니다.
타깃 페이지 범위 지정하기
for n in range(0, 10):
클리앙 중고장터에는 어마어마한 데이터가 있기 때문에 10페이지까지만 가지고 오도록 하겠습니다.
URL 구성하기
data ='https://www.clien.net/service/board/sold?&od=T31&po=' + str(n)
페이지 번호를 매개변수로 줘서 중고시장 게시판의 각 페이지에 대한 URL을 구성하겠습니다.
크롤링 요청 보내기
req = urllib.request.Request(data, headers=hdr)
data = urllib.request.urlopen(req).read()
아까 설정했던 아이폰 User-Agent 헤더를 사용하여 클리앙 URL에 요청을 보내고 응답을 읽습니다.
HTML 구문 분석
page = data.decode('utf-8', 'ignore')
soup = BeautifulSoup(page, 'html.parser')
크롤링하여 가지고 온 HTML코드를 사용하기 쉽게 BeautifulSoup을 사용하여 파싱합니다.
제목 찾기
list = soup.find_all('span', attrs={'data-role':'list-title-text'})
F12 개발자모드로 클리앙 사이트를 분석해 보면 클리앙의 제목은 <span> 태그의 data-role="list-title-text"으로 설정되어 있는 것을 확인할 수 있습니다. 그래서 이 속성이 설정된 요소를 가지고 오면 게시글 제목을 가지고 올 수 있습니다..
아이패드와 관련된 제목만 추출하고 출력하기
try:
title = item.text.strip()
if (re.search('아이패드', title)):
print(title.strip())
except:
pass
각 제목의 텍스트 내용을 추출하고, 선행/후행 공백을 제거한 뒤 '아이패드'라는 단어가 포함된 제목만 출력합니다.
'Language > Python' 카테고리의 다른 글
[Python] 파이썬 판다스(Pandas) 사용법 & 예제 (0) | 2023.12.08 |
---|---|
[Python] 파이썬 판다스(Pandas) 설치 / 다운로드 하기 + 버전 확인 (0) | 2023.11.29 |
[Python] 파이썬 SQLite3 모듈 사용법 & 예제 총정리 (0) | 2023.11.24 |
[Python] 파이썬 부동 소수점 오차 해결 (decimal 모듈 사용법) (0) | 2023.11.16 |