[python] 파이썬 BeautifulSoup을 이용한 뉴스 웹사이트 크롤링(제목, 이미지명, 내용) 방법

웹사이트를 크롤링하는 방법에는 여러 가지가 있다.
오늘은 그중에서 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 태그에서 텍스트를 가져온다.
 

파이썬을 실행 해보면 제가 원하는 기사의 제목과 이미지, 링크까지 아주 깔끔하게 가져오는 걸 알 수 있다.