웹사이트를 크롤링하는 방법에는 여러 가지가 있다.
오늘은 그중에서 BeautifulSoup을 이용해 원하는 웹사이트 정보를 크롤링하는 방법에 대해 알아보자.
BeautifulSoup 라이브러리
뷰티풀 스프는 HTML과 XML 문서들의 구문을 분석할 수 있는 파이썬의 패키지이다.
뷰티풀 수프는 2004년 레너드 리처드슨에 의해 개발되었으며 html로부터 데이터를 추출하기 위해 사용할 수 있는 파스 트리를 만드는데 매우 유용한 오픈소스다.
HTML 구성요소 확인
웹사이트를 크롤링 하기위해 네이버 뉴스페이지 중 생활/문화 기사페이지에 접속했다.
소스보기를 통해 해당문서의 구문을 파악하고 원하는 데이터를 추출해 보았다.
먼저 f12를 누르고 inspector를 통해 원하는 html 요소를 눌러준다.(단축키는 CTRL+SHIFT+C)
네이버 기사페이지는 newsflash _body 클래스가 있는 div안에 ul li 묶음과 각 하위에 dl, dt 태그로 페이지가 구성되어 있었다.
해당 url을 파싱해 div를 찾고 그 안에 li를 반복해 제가 필요한 기사링크와 제목, 이미지명을 긁어봤다.
BeautifulSoup을 이용해 원하는 HTML 요소를 찾기
import requests
import time
from bs4 import BeautifulSoup
def html_parse(url):
print("html_parse 시작")
response = requests.get(url ,headers={'User-Agent':'Mozilla/5.0'})
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
lis_list = soup.select('div.newsflash_body ul li')
html_parse("https://news.naver.com/main/list.naver?mode=LS2D&mid=shm&sid1=103&sid2=241")
requests.get(url)을 통해 원하는 url의 HTML문서 전체 페이지를 가져온다.
BeautifulSoup을 통해 html 데이터를 파싱 해준다.
파싱 된 데이터에서 css 선택자를 사용해 li 요소를 리스트로 저장한다.
for li in lis_list:
print(li)
dt = li.select('dt')[0].find('img')['src']
dt2 = li.select('dt')[0].find('a')['href']
dt3 = li.select('dt')[1].text
print('이미지 src : {0}, 링크 : {1}, 제목: {2}'.format(dt.strip(), dt2.strip(), dt3.strip()))
저장한 li 리스트를 반복해 원하는 요소를 직접 찾아 데이터를 추출한다.
1. 이미지명 :첫 번째 dt 태그에서 img를 찾아 src속성을 가져온다.
2. 기사링크 : 첫번째 dt 태그에서 a를 찾아 href 속성을 가져온다.
3. 기사제목 : 두 번째 dt 태그에서 텍스트를 가져온다.
파이썬을 실행 해보면 제가 원하는 기사의 제목과 이미지, 링크까지 아주 깔끔하게 가져오는 걸 알 수 있다.