RSS 피드를 활용하여 각종 언론사에서 뉴스 데이터 받기
RSS 피드를 활용하여 각종 언론사에서 뉴스 데이터 받기¶
RSS ?¶
RSS
: Rich Site Summary 또는 Really Simple Syndication. 舊 RDF Site Summary.
RSS는, 어떤 사이트에 새로운 콘텐츠가 올라왔을 때 해당 사이트에 방문하지 않고, RSS서비스를 통해 리더 한 곳에서 그 콘텐츠를 이용하기 위한 방법입니다. 쉽게 생각하면, 여러 언론사 사이트를 모두 방문할 필요 없이 다양한 기사를 네이버뉴스 한 곳에서 볼 수 있는 것과 같다고 보면 됩니다.
RSS 피드는 아래와 같이 XML 기반의 문서 포맷
으로 이루어져 있습니다. (조선일보 RSS 예시)
언론사들은 RSS 서비스를 통해 기사의 일부 정보를 제공합니다. 제가 노가다(?)를 통해 최근에도 기사가 올라오고있는 188개의 RSS 주소를 정리하였습니다. 파이썬에서 활용하기 쉽게 피클(pkl)파일로 만들어 두었으니 아래 코드를 따라하시려면 다운받아 주시면 됩니다. (제 마음대로 골라서 빠져있는 언론사도 존재합니다.)
저작권 이슈¶
언론사는 RSS를 통해 콘텐츠의 일부를 제공
하며 RSS 서비스는 일반인이나 관공서 및 기업등의 이용자가 개인 PC 등 한정된 공간 안에서 뉴스 콘텐트를
개인적으로 구독/이용 하는데 그쳐야 한다고 명시하고 있습니다.
일반인이나 관공서 및 기업이 RSS를 통해 구독하고 있는 뉴스 콘텐트를 홈페이지 또는 인트라넷에 노출해 다수의 이용자에게 보여주는 행위와 재(再)RSS서비스를 하는 행위는 콘텐츠의 복제 및 공중송신에 해당하므로 저작권자의 허락을 얻어야 합니다.
RSS 파싱에 필요한 모듈 설치¶
- feedparser : RSS를 간단하게 파싱하기 위해 필요한 모듈입니다.
- requests : Requests is an Apache2 Licensed HTTP library, written in Python, for human beings.
- goose3 : 기사 본문을 편리하게 파싱가능한 모듈입니다. (Python 3 기준)
import pandas as pd
import feedparser
import requests
from goose3 import Goose
from goose3.text import StopWordsKorean
RSS 리스트 살펴보기¶
다운 받은 rss_list.pkl을 주피터 노트북과 같은 폴더에 옮긴 뒤 읽어와 내용을 살펴봅시다.
rss_df = pd.read_pickle('rss_list.pkl')
rss_df.head()
188개의 RSS 피드가 존재합니다.
# 188개의 피드
len(rss_df)
언론사는 19개 입니다.
sources = rss_df.corp.unique()
sources
# 19개의 언론사
len(sources)
RSS 파싱 함수¶
get_data
라는 이름으로 RSS url을 입력 받으면 내용을 파싱하는 함수를 만들어 줍니다.
def get_data(url):
try:
res = requests.get(url)
html = res.text
data = feedparser.parse(html)
print(data.feed.title)
return data
except:
return None
잘 작동하는지 실험하기 위해 첫번째 RSS를 골라 테스트 해봅니다.
# 조선닷컴, [뉴스]오늘의 주요뉴스
rss_df.iloc[0]
url = rss_df.iloc[0].url
parsed_data = get_data(url)
type(parsed_data)
parsed_data
에 해당 피드 해당 데이터에 들어 있는 기사 갯수는 다음과 같습니다.
len(parsed_data['entries'])
기사(article) 정보 확인¶
num_entries = 2 # article 정보 확인을 위해 임의로 번호를 지정했습니다.
article = parsed_data['entries'][num_entries]
article
article은 위와 같이 딕셔너리 형태로 저장돼 있으며 keys
를 확인하면 아래와 같습니다. 아래와 같이 몇가지 key에 대하여 내용을 확인해 보도록 하겠습니다.
article.keys()
제목 확인¶
article['title']
기사 링크 확인¶
article['link']
기사 요약 확인¶
article['summary']
다른 key에 대한 내용은 직접 확인해 보시면 됩니다. 보통 언론사들은 RSS에서 기사 정보의 일부를 제공하기 때문에 기사 본문 내용을 제공하지 않는 경우가 많습니다. 기사 본문을 파싱은
아래와 같이 goose3
모듈을 활용하여 가능합니다.
article 본문 파싱하기¶
다음과 같이 손쉽게 기사 본문을 파싱 가능합니다.
reader = Goose({'stopwords_class':StopWordsKorean})
url = article['link']
contents = reader.extract(url=url)
contents
print(article.title+'\n')
print(contents.cleaned_text)
마지막으로 다시한번 Warning - 뉴스도 저작권 보호를 받습니다!¶
</html>