티스토리 뷰

반응형

※이 글은 자기개발 및 복습을 위한 글로, 야후 뉴스 크롤링에 대한 파이썬 코딩을 만드는 방법을 작성하는 글임을 밝힌다.

주식을 하다 보면, Telegram이나 카카오 오픈채팅 등의 소스에서 뉴스를 접하는 경우가 많은데, 남이 떠먹여 주기만 해서는 내가 시사에 관심을 가질 수 없음을 깨닫는다. 그래서 직접 Yahoo News의 자료들을 크롤링하여, 해당 내용들 중 중요한 내용들을 요약하여 내 텔레그램 Bot에 요약 자료까지 발송하는 일련의 가정을 작성하고자 한다.

 

 

https://wjjw.tistory.com/entry/Yahoocrawling1

 

[파이썬/응용]Yahoo 뉴스 자료 크롤링(1) / 원하는 뉴스 주소 크롤링

※이 글은 자기개발 및 복습을 위한 글로, 야후 뉴스 크롤링에 대한 파이썬 코딩을 만드는 방법을 작성하는 글임을 밝힌다.주식을 하다 보면, Telegram이나 카카오 오픈채팅 등의 소스에서 뉴스를

wjjw.tistory.com

포스팅 1에서 야후 뉴스 크롤링을 했다.

 

https://wjjw.tistory.com/entry/Yahoocrawling2

https://wjjw.tistory.com/entry/Yahoocrawling3

https://wjjw.tistory.com/entry/Yahoocrawling4

그리고 포스팅2~4를 통해 저성능용 로컬 LLM 설치를 완료했다.

나는 크롤링된 뉴스 href에 적힌 url과 LLM을 이용하여 영문 뉴스 요약 봇을 만들 것이다.

 

우선 해야할 일은

1. URL 기준으로 뉴스 제목과 기사를 추출하는 함수 생성

2. Ollama에서 설치한 LLM과 python을 연동하여 1을 실행

 

두 가지인데, 차례대로 진행하도록 한다.

 

1. URL 기준으로 뉴스 제목과 기사를 추출하는 함수 생성

 

 

 

 

 

 

최근 이슈가 된 일론머스크가 OpenAI에 대한 매수의사를 밝힌 건을 예시로 들어보도록 한다.

 

 

 

※우선 URL 추출하는 것은 (1) 포스팅을 참고하면 된다.

 

[파이썬/응용]Yahoo 뉴스 자료 크롤링(1) / 원하는 뉴스 주소 크롤링

※이 글은 자기개발 및 복습을 위한 글로, 야후 뉴스 크롤링에 대한 파이썬 코딩을 만드는 방법을 작성하는 글임을 밝힌다.주식을 하다 보면, Telegram이나 카카오 오픈채팅 등의 소스에서 뉴스를

wjjw.tistory.com

 

import requests
from bs4 import BeautifulSoup

def get_news(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    }

    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, 'html.parser')

    title = soup.select('div.cover-headline div')  # 클래스명으로 선택
    body = soup.select('div.body-wrap')  # 클래스명으로 선택

    if title and body:
        return [
            title[0].get_text(strip=True),  # 첫 번째 요소: 제목
            body[0].get_text(strip=True),   # 두 번째 요소: 내용
            url                             # 세 번째 요소: URL
        ]

    return []  # 결과가 없을 경우 빈 리스트 반환

1. 라이브러리 임포트

import requests # HTTP 요청을 보내기 위한 라이브러리 
from bs4 import BeautifulSoup # HTML 파싱을 위한 라이브러리
2. 함수 정의
def get_news(url): # URL을 매개변수로 받는 함수 정의

3. 헤더 설정

headers = {     'User-Agent': 'Mozilla/5.0...' # 웹 브라우저처럼 보이게 하는 User-Agent 설정 }
  • 웹사이트가 봇을 차단하는 것을 방지하기 위한 설정
  • 실제 브라우저처럼 보이게 함

4. 웹 요청 및 파싱

response = requests.get(url, headers=headers) # URL에 GET 요청 
soup = BeautifulSoup(response.text, 'html.parser') #HTML 파싱

5. 요소 선택

우선 제목에서 검사를 누르고 항목을 찾아보면 cover-headline division의 하위 division임을 알 수 있다.

 

그리고 본문은 body-wrap division에 있음을 알 수 있다. 이를 각각 title과 body로 입력했다.

title = soup.select('div.cover-headline div') # 제목 요소 선택 
body = soup.select('div.body-wrap') # 본문 요소 선택
  • CSS 선택자를 사용하여 특정 클래스를 가진 요소 선택
  • div.cover-headline div: cover-headline 클래스를 가진 div 안의 div 요소
  • div.body-wrap: body-wrap 클래스를 가진 div 요소

6. 결과 반환

    if title and body:
        return [
            title[0].get_text(strip=True),  # 첫 번째 요소: 제목
            body[0].get_text(strip=True),   # 두 번째 요소: 내용
            url                             # 세 번째 요소: URL
        ]

    return []  # 결과가 없을 경우 빈 리스트 반환
  • get_text(strip=True): 텍스트만 추출하고 앞뒤 공백 제거
  • 결과를 리스트 형태로 반환

결과값은 아래와 같다.

 

이렇게 지정된 값을 이제 Ollama에서 설치한 LLM과 연동해보자.

 

 

2. Ollama에서 설치한 LLM과 python을 연동하여 1을 실행

추출한 뉴스의 제목은 그대로 두고 본문을 요약한다면, 직관적으로 이해하기 쉬울 것이라 판단하여 본문만 요약하는 쿼리를 짰다.

ollama 연동은 상대적으로 쉬운데, 쿼리는 아래와 같다.

import ollama


def summary_ai(news):
    response = ollama.chat(
            model='myllm',
            messages=[{
                'role': 'user',
                'content': f"""
                Summarize the following news in two parts:
                
                Key Summary:
                - Provide exactly 5 clear, concise sentences capturing the main story
                - Focus on facts and key developments
                - Present in chronological order when possible
                
                Main Points:
                - List exactly 3 essential takeaways
                - Each point should be one clear, complete sentence
                - Focus on impact and significance
                
                News text:
                {news[1]}
                        """
                    }]
                )
    return response.message.content
print(summary_ai(news))

1. 라이브러리 임포트

import ollama  # Ollama AI 모델을 사용하기 위한 라이브러리 임포트

2. 함수 정의 및 호출

def summary_ai(news):
    response = ollama.chat(
            model='myllm',
            messages=[{
                'role': 'user',
                'content': f"""
                Summarize the following news in two parts:
              
                Key Summary:
                - Provide exactly 5 clear, concise sentences capturing the main story
                - Focus on facts and key developments
                - Present in chronological order when possible
              
                Main Points:
                - List exactly 3 essential takeaways
                - Each point should be one clear, complete sentence
                - Focus on impact and significance
              
                News text:
                {news[1]}
                        """
                    }]
                )
    return response.message.content

함수를 정의 해주는데, ollama.chat 함수를 사용하면 된다.

model을 지정해준 뒤, message를 dictionary 형식으로 지정하고

response->message->content를 반환해주면 끝!

 

 

해당 작업을 실행해보면, 영문으로 뉴스를 잘 요약해줌을 확인할 수 있다.

(반복 시, 내용이 계속 바뀐다.)

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함