feedparser 모듈을 이용한 google trend rss 파싱
python feedparser 모듈은 xml 형태의 rss 피드를 손쉽게 파싱할 수 있습니다.
feedparser.parse(url) 로 rss 피드 url 만 인자로 보내면 uncode type 의 값을 받을 수 있습니다.
🧩1. feedparser 모듈
sudo pip install feedparser
- 터미널에 sudo pip install feedparser 를 입력해서 라이브러리를 설치합니다.
- 기본적인 사용법은 아래와 같습니다.
import feedparser
d = feedparser.parse('http://feedparser.org/docs/examples/atom10.xml')
d['feed']['title']
#출력된 값 Sample Feed
🧩2. feedparser 특징
feedparser library 는 대부분의 feeds 를 파싱할 수 있습니다.
- RSS 0.90, Netscape RSS 0.91, Userland RSS 0.91, RSS 0.92, RSS 0.93, RSS 0.94, RSS 1.0, RSS 2.0, Atom 0.3, Atom 1.0, CDF feeds 등 다양한 형태들을 파싱합니다.
- 파싱되는 element 를 확인하는 방법은 다음과 같습니다.
import feedparser
d = feedparser.parse('http://feedparser.org/docs/examples/atom10.xml')
print(d.keys())
- element 가 있는지 테스트 하는 방법은 다음과 같습니다.
import feedparser
d = feedparser.parse('http://feedparser.org/docs/examples/atom10.xml')
'title' in d.feed
'ttl' in d.feed
#출력된 값
True
False
d.feed.get('title', 'No title')
u'Sample feed'
#출력된 값
d.feed.get('ttl', 60)
60
🧩3. google trend rss
rss feed xml
- https://trends.google.com/trends/trendingsearches/daily/rss?geo={geo} 이며 geo 값은 2자리 국가 코드입니다.
- 한국 트렌드의 경우 {geo}에 대문자 KR을 입력하면 됩니다.
- google trend feed의 xml 데이터입니다.
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:ht="https://trends.google.com/trends/trendingsearches/daily" version="2.0">
<channel>
<title>Daily Search Trends</title>
<description>Recent searches</description>
<link>https://trends.google.com/trends/trendingsearches/daily?geo=KR</link>
<atom:link href="https://trends.google.com/trends/trendingsearches/daily/rss?geo=KR" rel="self" type="application/rss+xml" />
<item>
<title>전지현 남편</title>
<ht:approx_traffic>20,000+</ht:approx_traffic>
<description>전지현 이혼, 전지현, 최준혁</description>
<link>https://trends.google.com/trends/trendingsearches/daily?geo=KR#%EC%A0%84%EC%A7%80%ED%98%84%20%EB%82%A8%ED%8E%B8</link>
<pubDate>Thu, 03 Jun 2021 01:00:00 +0900</pubDate>
<ht:picture>https://t3.gstatic.com/images?q=tbn:ANd9GcR6NQQP_uEIXg9NV_l4_T-nGFruoz5MGn-V7bOyoM5Bcroa71SD3gTryFpaUZGhzK1KP_cDnVyy</ht:picture>
<ht:picture_source>중앙일보</ht:picture_source>
<ht:news_item>
<ht:news_item_title>“젼젼(전지현) 남편하고 싶어요”…최준혁 이혼설 일축 - 중앙일보</ht:news_item_title>
<ht:news_item_snippet>배우 전지현의 남편 최준혁 알파자산운용 대표가 이혼설을 일축했다. 다음 컷에서는 "젼젼(전지현) 남푠(남편) 하고 싶어요…"라며 무릎을 꿇었다. 이날 전지현의 ...</ht:news_item_snippet>
<ht:news_item_url>https://news.joins.com/article/24073984</ht:news_item_url>
<ht:news_item_source>중앙일보</ht:news_item_source>
</ht:news_item>
<ht:news_item>
<ht:news_item_title>전지현, 남편 최준혁과 이혼설</ht:news_item_title>
<ht:news_item_snippet>전지현, 남편 최준혁과 이혼설 - 스타투데이, 작성자-양소영, 섹션-hot-issues, 요약-[매일경제 스타투데이 양소영 기자] 배우 전지현(40)이 남편인 최준혁(40) 알파자산 ...</ht:news_item_snippet>
<ht:news_item_url>https://www.mk.co.kr/star/hot-issues/view/2021/06/535187/</ht:news_item_url>
<ht:news_item_source>매일경제</ht:news_item_source>
</ht:news_item>
</item>
<item>
<title>이투스</title>
<ht:approx_traffic>5,000+</ht:approx_traffic>
<description />
<link>https://trends.google.com/trends/trendingsearches/daily?geo=KR#%EC%9D%B4%ED%88%AC%EC%8A%A4</link>
<pubDate>Thu, 03 Jun 2021 22:00:00 +0900</pubDate>
<ht:picture>https://t1.gstatic.com/images?q=tbn:ANd9GcSKaxO7pDp5fybAYzKJ0SahZLYg0bGNs3__08V8WW0EM2zAPQCJwvOn-gEl0Qk5Nr0ssivffysr</ht:picture>
<ht:picture_source>천지일보</ht:picture_source>
<ht:news_item>
<ht:news_item_title>[종합] '이투스' 캐시워크 돈버는퀴즈 정답 'ㅎㅈ'</ht:news_item_title>
<ht:news_item_snippet>[종합] '이투스' 캐시워크 돈버는퀴즈 정답 3일 '이투스' 관련 캐시워크 돈버는퀴즈 정답이 공개됐다.이날 오후 6시 출제된 캐시워크 돈버는퀴즈는 “6월 모의고사 후 ...</ht:news_item_snippet>
<ht:news_item_url>http://www.newscj.com/news/articleView.html?idxno=866671</ht:news_item_url>
<ht:news_item_source>천지일보</ht:news_item_source>
</ht:news_item>
<ht:news_item>
<ht:news_item_title>이투스 정각선착순 캐시워크 돈버는퀴즈 정답은? 'ㅈㅎㄱ'</ht:news_item_title>
<ht:news_item_snippet>[뉴스웍스=이동헌 기자] 이투스 정각선착순이 3일 캐시워크 돈버는 퀴즈를 실시했다.이날 오후 9시 출제되는 '다시 돌아온 이투스의 레전드 정각선착순 이벤트' 관련 ...</ht:news_item_snippet>
<ht:news_item_url>http://www.newsworks.co.kr/news/articleView.html?idxno=552271</ht:news_item_url>
<ht:news_item_source>뉴스웍스</ht:news_item_source>
</ht:news_item>
</item>
</channel>
</rss>
🧩4. feedparser 파싱 방법
for post in d.entries
- feedparser.parse() 메소드로 파싱한 데이터에서 enntries 들을 추출합니다.
- 3번에서 확인 가능한 tag들을 post.{tag} 형태로 추출할 수 있습니다.
- ht:news_item_title 과 같이 :(콜론)이 쓰인 tag는 _(언더바)로 대체합니다.
import time
import feedparser
def fetch_xml(country_code):
url = "https://trends.google.com/trends/trendingsearches/daily/rss?geo="+country_code
start = time.time()
d = feedparser.parse(url)
e = len(d['entries'])
t = time.strftime('%Y-%m-%d', time.localtime(time.time()))
for post in d.entries:
post_content = '<div class="ll_div">' \
'<a href="' +post.ht_news_item_url + '" target=_blank>' \
+ '<div class="ll_div_left">' \
+ '<h1>'+ post.title + '</h1>' \
+ '<h3>' + post.ht_approx_traffic + '</h3>' \
+ '<h4>' + post.description + '</h4>' \
+ '</div>' \
+ '<div class="ll_div_right">\n' \
+ '<img src="' +post.ht_picture + '"/><br/>' + post.ht_picture_source\
+ '</div>' \
+ '<div class="ll_div_clr"></div>' \
+ '<div class="ll_div_footer">' \
+ '<h2>'+ post.ht_news_item_title + '</h2>' \
+ '<p>' + post.ht_news_item_snippet + '<br />source : ' + post.ht_news_item_source + '</p>' \
+ '</div>' \
+ '</a>' \
+ '</div>' \
+ '<div class="line-separator"></div>\n'
print(t +' google trend' + '\n' +post_content)
response_time = time.time() - start
print("The request took %d s to complete." % response_time)
return e
if __name__ == '__main__':
trends = fetch_xml("KR")
print(trends)
참고 자료
https://feedparser.readthedocs.io/en/latest/index.html
https://www.pythonforbeginners.com/feedparser/using-feedparser-in-python
https://stackoverflow.com/questions/61811780/issue-while-using-python-rss-feed-with-feedparser
0 댓글