본문 바로가기
IT - 코딩

경제영어뉴스_자동요약(수정 중)

by 조기정 2023. 7. 23.
!pip install selenium
!pip install webdriver_manager
!pip install --upgrade selenium
!pip install chromedriver_autoinstaller



import os
import openai
import time
import datetime
import requests
from bs4 import BeautifulSoup
import datetime as dt
import sys
# import tistoryAPI
# import blogInfo
# import papagoAPI
# import papagoID

import selenium
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()

import time
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
import openai


# OPENAI API키 설정
openai.api_key = "sk-W2x3457374347437d0HolA2EmqpDA"

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import xmltodict
import json

# # 크롬드라이버 셋팅
# def set_chrome_driver(headless=True):
#     options = webdriver.ChromeOptions()
#     if headless:
#         options.add_argument('headless')
#     options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36")
#     driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
#     return driver


# 크롬드라이버 셋팅
def set_chrome_driver(headless=False):
    options = webdriver.ChromeOptions()
    if headless:
        options.add_argument('headless')
    options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36")
#     driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
    driver = webdriver.Chrome(executable_path='C:\Program Files\Chrome Driver\chromedriver.exe')
    return driver

# 뉴스 페이지 크롤링
def crawl_page(url):
    try:
        driver = set_chrome_driver(False)
        driver.get(url)
        # 요소 변경 가능
        article_page = driver.find_element(By.CLASS_NAME, 'articlePage')
        text = article_page.text
        driver.close()
    except NoSuchElementException:
        text = ""
    return text


# ChatGPT 요약 # @ 이게 맞지?
def summarize(text):
    # 모델 엔진 선택
    model_engine = "gpt-3.5-turbo" # "gpt-3.5-turbo-16k" => 안되면 이걸로.

    # 맥스 토큰
    max_tokens = 16000

    # 프롬프트 (요약해줘!)

    prompt =  f'''Summarize the paragraph below and interpret whether it is a positive or negative sentiment.
    {text}
    '''

    completion = openai.ChatCompletion.create(
      model=model_engine,
      temperature=0.3,      # creativity
        
      messages=[
        {"role": "user", "content": prompt}
      ]
    )

    return completion.choices[0].message.content

# 파파고 번역
def papago_translate(text):
    try:
        papago = set_chrome_driver(False)
        papago.get('https://papago.naver.com/')
        time.sleep(1)
        papago.find_element(By.ID, 'txtSource').send_keys(text)
        papago.find_element(By.ID, 'btnTranslate').click()
        time.sleep(2)
        papago_translated = papago.find_element(By.ID, 'targetEditArea')
        result = papago_translated.text
    except NoSuchElementException: # 예외처리 (요소를 찾지 못하는 경우)
        result = '번역 오류ㅠㅠ'
    finally:
        papago.close()
    return result

# 최종 wrapper
def summarize_news(url):
    page = crawl_page(url)
    summarized = summarize(page)
    print('[원문 요약]')
    print(summarized)
    korean_translated = papago_translate(summarized)
    print('\n[한글 요약]')
    print(korean_translated)
    return korean_translated
    
import time
import telegram
def Telegramchat(text):
    telegram_token = '5106829469:AAGc-XqcK67mDADEuJERXFXgazI68dcO_x0'
    telegram_chat_id = '5257112430'
    bot = telegram.Bot(token = telegram_token)

#     text = "김프알람"
    url = 'https://api.telegram.org/bot'+telegram_token+'/sendMessage?chat_id='+telegram_chat_id+'&text='+text
    return requests.get(url)

일단 글은 수정 중에 있고.. 코드도 최적화는 덜 되어 있다. 순기능만 하는 정도인데...

 

try: # 문제가 생겨 코드가 종료 될 경우 텔레그램으로 재실행을 위한 알람이 보내짐
    while True:
        now = datetime.datetime.now()
        if now.hour== 18 or now.hour== 9: # 아침 9시 저녁 18시 뉴스 요약.
            
            # most popular news 의 신문기사 요소를 크롤링 합니다
            top5 = set_chrome_driver(False)
            # URL 요청
            top5.get('https://www.investing.com/news/most-popular-news')
            # 5개의 요소만 가져옵니다.
            top5.find_element(By.CLASS_NAME, 'largeTitle').find_elements(By.CLASS_NAME, 'js-article-item')[:5]


            # 5개의 신문기사 URL 만 추출 합니다.
            top5_links = []

            for link in top5.find_element(By.CLASS_NAME, 'largeTitle').find_elements(By.CLASS_NAME, 'js-article-item')[:3]:
                top5_links.append(link.find_element(By.CSS_SELECTOR, 'a').get_attribute('href'))


            # 5개의 신문기사 링크에 대한 본문 크롤링+요약+번역 을 진행합니다.
            top5_summarize = []

            for link in top5_links:
                output = summarize_news(link)
                top5_summarize.append(output)
                print()


            # Print the generated text
            # t_title = papagoAPI.translate("How to make money with Bitcoin","en","ko") 
            # t_title = "현재 인기 top5 경제뉴스 요약 _"+"연"+"월"+"일"+"시"

            #티스토리 태그정보 입력            
            tagName = "Economic News Summary,Economic,News,Sentiment Analysis"
            visiblityCd = "3"    # 발행상태 (0: 비공개 - 기본값, 1: 보호, 3: 발행)
            publishedDt = None   # 발행시간 (TIMESTAMP 이며 미래의 시간을 넣을 경우 예약. 기본값: 현재시간)    
            # 티스토리 API 이용하여 포스트 등록
            # content = papagoAPI.translate(generated_text,"en","ko") 
            # content =  '<pre class="mipsasm">' + generated_text + '</pre>'
            content =  top5_summarize
            
        time.sleep(3600)
except Exception as e:
    send_text = "블로그 자동 글 올리기 오류남 확인 할것"+str(e)
    response = Telegramchat(send_text)
#     print(response)

여기가 main 함수로 쓸 부분이다. 

1. 뉴스기사를 셀레니움을 통해 크롤링 한다. 

2. 영어 사이트이기 때문에 챗gpt로 요약 및 긍부정 판단을 해주라고 요청 (기사 5개 정도)

3. 요약 및 감성분석이 된 기사를 블로그에 기재한다.

인데 블로그에 기재하는 부분에서 api로 요청할 경우 글자수가 길면 (t스토리)서버에서 요청을 받아주질 않는다

그래서 글을 개제한 후 내 블로그 주소를 통해 셀레니움으로 자동으로 텍스트만 따로 올리는 방식으로 수정하려고 한다. 

지금은 글자수를 줄이기 위해서 어쩔 수 없이 대충 요약해서 올리는 방식으로 구성해 두었다.

 

=====================================

블로그 자동화를 위한 초기 세팅은 우선 

1.번을 하기 위해서 크롬 업데이트를 끈다.

 

https://itons.net/%EA%B5%AC%EA%B8%80-%ED%81%AC%EB%A1%AC-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8-%EB%A7%89%EA%B8%B0-%ED%99%95%EC%8B%A4%ED%95%9C-3%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95/

 

구글 크롬 업데이트 막기 확실한 3가지 방법 - 아이티온즈넷

구글 크롬 업데이트 서비스를 중지하거나 작업 스케줄 동작을 끄고 GoogleUpdate 파일 이름을 변경해 크롬 브라우저 업데이트를 확실하게 막을 수 있습니다.

itons.net

그 다음 

'IT - 코딩' 카테고리의 다른 글

AI spark 미세먼지 농도 예측  (0) 2023.04.30
chat GPT4 API 사용 오류  (2) 2023.04.14