[python] google trend rss parsing 구글 트렌드 파싱

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>배우 전지현의 남편 최준혁 알파자산운용 대표가 이혼설을 일축했다. 다음 컷에서는 &quot;젼젼(전지현) 남푠(남편) 하고 싶어요…&quot;라며 무릎을 꿇었다. 이날 전지현의&nbsp;...</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) 알파자산&nbsp;...</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>[종합] &#39;이투스&#39; 캐시워크 돈버는퀴즈 정답 &#39;ㅎㅈ&#39;</ht:news_item_title>
                <ht:news_item_snippet>[종합] &#39;이투스&#39; 캐시워크 돈버는퀴즈 정답 3일 &#39;이투스&#39; 관련 캐시워크 돈버는퀴즈 정답이 공개됐다.이날 오후 6시 출제된 캐시워크 돈버는퀴즈는 “6월 모의고사 후&nbsp;...</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>이투스 정각선착순 캐시워크 돈버는퀴즈 정답은? &#39;ㅈㅎㄱ&#39;</ht:news_item_title>
                <ht:news_item_snippet>[뉴스웍스=이동헌 기자] 이투스 정각선착순이 3일 캐시워크 돈버는 퀴즈를 실시했다.이날 오후 9시 출제되는 &#39;다시 돌아온 이투스의 레전드 정각선착순 이벤트&#39; 관련&nbsp;...</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 댓글