[LLM 기반 증시 상황 요약 Bot] (2) 전자 신문 Crawling

2024. 5. 2. 22:51프로젝트

1) 필요한 라이브러리를 설치하고 불러온다

!pip install feedparser
!pip install newspaper3k
!pip install konlpy

import feedparser  # rss 에서 xml 정보 추출
from newspaper import Article  # 인터넷 신문 기사 분석
from konlpy.tag import Okt  # 한국어 자연어 처리/형태소 분석기

 

설치를 했음에도 'no module found error'가 발생한다면, path를 추가해줘야 한다. 

라이브러리 설치 저장 경로를 확인하여 path로 추가해준다.

import sys
sys.path.append('c:\\users\\dmlql\\appdata\\roaming\\python\\python311\\site-packages')
print(sys.path)

 

 

2) RSS파일에서 기사 제목/link 추출

전자신문의 RSS 파일 link이다.

들어가보면 위와 같은 XML 파일이 나오는데 여기서 필요한 정보인 title과 link만 따로 저장한다.

urls = ["http://rss.etnews.com/Section901.xml",  
        "http://rss.etnews.com/Section902.xml",
        "http://rss.etnews.com/Section903.xml",
        "http://rss.etnews.com/Section904.xml"]

# 아래 함수는 RSS목록의 list안에 존재한느 모든 기사의 title, link를 list로 구성
def crawl_rss(urls):
    array_rss = []  # 여기메 모든 기사 채울 것
    title_set = set()  # 중복 기사 제거하기 위함
    for url in urls:
        print("[Crawl URL]", url)
        parse_rss = feedparser.parse(url)  # 현재 url을 파싱한 후에 결과를 저장
        for p in parse_rss.entries:  # parse_rss에 있는 모든 entries/기사를 검색
            if p.title in title_set :
                print("Duplicated Article", p.title)
                continue
            array_rss.append({'title':p.title, 'link':p.link})
            title_set.add(p.title)
    return array_rss

list_articles = crawl_rss(urls)
print(list_articles)

각각 오늘의 뉴스, 뉴스 속보, 오늘의 인기기사, 오늘의 추천기사의 RSS 파일에서 기사를 추출하는데 중복성이 있을 수 있으므로 제거하는 코드를 넣어놨다.

 

3. Article Link를 통해 본문 긁어오기

앞에서 RSS 파일을 통해 각 기다들의 Link 정보를 저장했다. 이 Link를 통해 기사 내용을 긁어올 수 있다. 기존의 기사를 저장한 list에 dict 형태로 저장한다.

def crawl_article(url, language='ko'):
    print("[Crawl Article]", url)  # 현재 title과 text를 추출할 url을 프린트 해줌
    a = Article(url, language = language)  # Article을 사용하여 그 URL을 입력하고, 언어옵션지정(한글어기본), 결과를 a에 저장
    a.download()
    a.parse()
    return a.title, a.text  # a에 해당하는 title과 본문(text)을 출력한다.
    
# 몬문내용 저장
for article in list_articles:
    _, content = crawl_article(article['link'])
    article['content'] = content  

list_articles

 

4. Json 파일로 기사 내용 저장

해당 기사의 내용들을 json 파일로 저장한다. json 파일로 저장하는 이유는 추후에 데이터를 쉽게 parsing 하기 위함이다. 한글 데이터를 encoding 할 수 있는 utf-8을 적용한다.

 

content_file = WORK_DIR + 'articles.json'

with open(content_file, 'w', encoding='utf-8') as f:
    for article in list_articles:
        f.write(json.dumps(article, ensure_ascii=False))
        f.write('\n')