뉴스를 수집하고 중복을 판단해서 제거(Gathering & Deduplication)하는 포스트를 작성하려고 합니다.

우선 RSS(Really Simple Syndication)를 정의 해보면 웹사이트의 최신 콘텐츠를 빠르고 편리하게 받아볼 수 있도록 제공하는 XML 기반의 데이터 형식입니다. 주로 블로그, 뉴스 사이트, 팟캐스트 등에서 사용됩니다.

RSS 주요 특징

  1. 자동 업데이트: 새로운 게시물이 올라오면 구독자에게 자동으로 알립니다.
  2. 효율성: 여러 웹사이트를 일일이 방문하지 않고, 한곳에서 모든 최신 정보를 확인할 수 있습니다.
  3. 사용자 편의성: RSS 리더(Feedly, Inoreader 등)를 통해 여러 피드를 한 번에 관리 가능합니다.
  4. 광고 없음: 원문 콘텐츠만 제공되어 깔끔하게 정보를 확인할 수 있습니다.

Gathering

처음에 Crawling으로 방향을 잡았다가 RSS가 된다는 것을 알고 나서 feedparser 라이브러리를 사용하게 됬습니다.

그리고 파싱 소스가 원격지에 있는 RSS URL 주소, 로컬 파일, String까지 되는 것으로 봐서 RSS도 여러가지 방법으로 사용하고 있는 것을 알 수 있다.

수집을 하게 되면 title, description, link, published 4개의 정보를 가지고 있는 자료들이 추출 된다고 보면 될 것 같습니다.

Deduplication

이전에 작성했던 difflib 포스트의 내용에 따라서 한번 작성해봤습니다. 유사성은 0.7로 맞춰놓은 상태로 유사하다고 판단되면 해당 그냥 List에서 삭제해버리는 방식입니다.

RSS Source

https://www.chosun.com/arc/outboundfeeds/rss/?outputType=xml
https://rss.donga.com/total.xml
https://www.mk.co.kr/rss/30000001/
https://rss.hankyung.com/feed/headline.xml
https://www.khan.co.kr/rss/rssdata/total_news.xml
http://www.yonhapnewstv.co.kr/browse/feed/
https://news.sbs.co.kr/news/SectionRssFeed.do?sectionId=02&plink=RSSREADER
https://fs.jtbc.co.kr/RSS/economy.xml
https://rss.nytimes.com/services/xml/rss/nyt/World.xml
https://rss.nytimes.com/services/xml/rss/nyt/US.xml
http://rss.cnn.com/rss/edition.rss
http://rss.cnn.com/rss/edition_world.rss

Code

import os
import feedparser
import difflib

def dup_delete(news_lists):
    new_index = -1
    for news in news_lists:
        new_index += 1
        diff_index = 0
        for diff_news in news_lists:
            diff_index += 1
            if new_index < diff_index:
                # titel similarity
                similarity = difflib.SequenceMatcher(None, news[0], diff_news[0]).ratio()
                if 0.7 < similarity:
                    del news_lists[diff_index - 1]
                    diff_index -= 1 # delete list element index re-arrange
                else:
                    pass
    return news_lists

def get_rss_news(url):
    feed = feedparser.parse(url)
    ret_lists = []
    for item in feed.entries:
        try:
            #print(f'Item title: {item.title}')
            #print(f'Item description: {item.description}')
            #print(f'Item link: {item.link}')
            #print(f'Item published: {item.published}')
            ret_lists.append([item.title, item.description])
        except:
            continue
    return ret_lists
"""
The New York Times : https://rss.nytimes.com/
CNN : http://edition.cnn.com/services/rss/
"""

if '__main__' == __name__:
    news_rss_site = [
        "https://rss.nytimes.com/services/xml/rss/nyt/World.xml",
        "https://rss.nytimes.com/services/xml/rss/nyt/US.xml",
        "http://rss.cnn.com/rss/edition.rss",
        "http://rss.cnn.com/rss/edition_world.rss"
        ]
    news_lists = []
    for url in news_rss_site:
        news = get_rss_news(url)

        for new in news:
            news_lists.append(new)
    print(len(news_lists))
    news_lists = dup_delete(news_lists)
    print(len(news_lists))
    print(news_lists)

Output

64
32
[['Video shows moment of deadl .....]...,[],[]]

취합과 중복제거(Gathering & Deduplication)를 하고 있는데 체감상으로는 70% 정도가 줄어든 것 같습니다.

여기에 중요도를 높혀서 우선순위를 정리하는 것을 해놓긴 했는데 포스트로 작성하기에는 너무 혼란스러운 코드이다 보니 나중에 다른 기법을 좀 이용해서 포스트 해보려고 합니다. 사실 리스트에 얼마나 많이 중복되는지를 표기하고, Sort 하면 될거 같긴합니다.

By Mark

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다