본문 바로가기

About 배우고 익히는법/Python

간단한 뉴스 스크랩 만들기

은 정보의 보고라고 불립니다. 우리가 이용하는 네이버, 구글 같은 검색 사이트도 웹을 이곳저곳 다니면서 데이터를 수집, 저장하고 분석해서 빠른 검색이 가능하게 도와주는 일을 합니다. 

검색 사이트에 일일이 들어가지 않으면서, 내가 원하는 키워드를 입력해서 뉴스 사이트 검색 결과를 가져오는 작업을 해보려 합니다. 검색 결과 목록 중에서 뉴스 제목과 해당 언론사 사이트로 연결되는 링크 정보만 따로 모아서 정리해보겠습니다. 최종 자료는 엑셀(Excel) 파일로 저장합니다. 

뉴스 사이트 선택하기

뉴스 정보를 가져올 웹사이트를 선택해서 스크래핑이 가능한 구조인지 먼저 체크합니다. 자바스크립트로 구성된 동적 웹페이지는 정보를 가져오려면 복잡한 단계를 거쳐야 하기 때문에, 정적 html로 만들어진 웹사이트를 선택합니다. 

예제는 구글 뉴스(https://news.google.com/?hl=ko&gl=KR&ceid=KR%3Ako)를 이용합니다.

requests + bs4.BeautifulSoup 라이브러리

bs4.BeautifulSoup은 html을 파싱(해석) 하는데 가장 많이 사용되는 파이썬 라이브러리가 아닐까 싶습니다. 해석하기 위한 html을 가져오기 위해서는 url을 통해 웹(web)에 접속하는 라이브러리가 필요합니다. 예제에서는 requests를 사용합니다. 


Step 1: 필요한 라이브러리를 가져옵니다. 

import requests
import bs4
import pandas as pd

Step 2: 뉴스 검색창에 검색어(예: 대한항공)를 입력하고 link를 복사합니다. 
구글 뉴스 메인 페이지와 검색 결과 페이지의 url이 다른 부분을 살펴봅니다.
 search?q= 다음에 연결되는 EB%8C%80%ED%95%9C%ED%95%AD%EA%B3%B5 검색어인 '대한항공'을 바이트(bytes)로 변환한 값입니다. 스크래핑을 어렵게 만드는 것 중의 하나입니다. 

[구글 뉴스 메인 페이지] https://news.google.com/?hl=ko&gl=KR&ceid=KR%3Ako
[구글 뉴스 검색 페이지] https://news.google.com/search?q=%EB%8C%80%ED%95%9C%ED%95%AD%EA%B3%B5&hl=ko&gl=KR&ceid=KR%3Ako

초급 단계이므로 뉴스 검색창에 '대한항공'을 입력하고 검색한 결과 페이지의 link인 'https://news.google.com/search?q=%EB%8C%80%ED%95%9C%ED%95%AD%EA%B3%B5&hl=ko&gl=KR&ceid=KR%3Ako'를 url 변수에 지정합니다.  

url = 'https://news.google.com/search?q=%EB%8C%80%ED%95%9C%ED%95%AD%EA%B3%B5&hl=ko&gl=KR&ceid=KR%3Ako'



Step 3: requests로 url에 접속하여, 웹페이지 내용을 가져오고, bs4.BeautifulSoup으로 해석합니다.  
requests.get 함수에 url을 인자로 전달하면, url 웹페이지 내용을 response 객체로 반환합니다. response 객체를 resp 변수에 지정하고, bs4.BeautifulSoup으로 resp.text를 'lxml' 형태로 파싱(해석) 합니다. 파싱 한 내용을 soup 변수에 지정합니다. 

resp = requests.get(url)
soup = bs4.BeautifulSoup(resp.text, 'lxml')



Step 4: css selector를 이용하여 soup 객체에서 원하는 정보를 가져와서 정리합니다.

items = soup.select('div > article > div > div > a')

크롬에서 css selector를 사용하는 방법은 아래 포스팅(http://okkam76.blog.me/221281008012)을 참조하시기 바랍니다.


Step 5: css selector로 가져온 items 리스트에서 for 반복문으로 하나씩 점검하면서 뉴스 제목과 링크(href)를 가져온 후에 각각 titles와 links라는 리스트에 담는다. 

items 리스트에서 첫 번째 요소를 출력한 결과입니다. 우리가 원하는 뉴스 제목과 링크(href 속성) 정보를 담고 있는 것을 확인할 수 있습니다. 

titles = []
links = []
for item in items:    
    title = item.text
    link = 'https://news.google.com'+ item.get('href')[1:]
    titles.append(title)
    links.append(link)

Step 6: 두 리스트에 담긴 뉴스 제목과 링크를 dictionary 형태로 만들어서 data 변수에 지정하고, 이 data 딕셔너리를 pandas.DataFrame 함수를 사용하여 dataframe으로 변환하고, excel로 저장합니다.  
    
data = {'title' : titles, 'link' : links}
df = pd.DataFrame(data, columns=['title', 'link'])
df.to_excel('./google news scrap.xlsx')

데이터프레임을 엑셀파일로 저장하는 것은 아래 링크(http://okkam76.blog.me/221300035243)를 참조하시기 바랍니다.  

엑셀(Excel) 파일 내용 확인하기