뉴스 크롤링, ChatGPT 요약, 구글 스프레드시트 연동 자동화

 

📍실습코드(.ipynb) : https://drive.google.com/file/d/1ztil...

📍셀레니움 공식 문서 : https://selenium-python.readthedocs.io/

📍OpenAI API 공식 문서 : https://platform.openai.com/docs/over...

 

01:12 웹크롤링을 위한 셀레니움 사용하기

07:06 셀리니움으로 요소 접근하기

12:47 네이버 오늘의 뉴스 크롤링하기

25:23 크롤링한 기사 ChatGPT로 요약하기

34:00 구글 스프레드 시트 셋팅하기

40:20 요약 결과 스프레드 시트에 저장하기

 

https://www.youtube.com/watch?v=waP8gsaaIys

 

패키지 설치

pip install selenium==4.1.5

pip install webdriver-manager

pip install openai

pip install gspread

 
-----------------------------------------------------------------------

네이버 뉴스 “스포츠” 카테고리 모든 기사 링크 긁어오기

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By

driver = webdriver.Chrome(ChromeDriverManager().install())
 
 
원하는 부분 클릭해보기 & 링크 가져오기
 
sel = driver.find_element(By.ID, 'sp_nws1')
sel.click()
 
news_links = driver.find_elements(By.CLASS_NAME, 'link_today')

news_links[0].get_attribute("href")

 

cnt = 1

for news in news_links:

    print("[오늘의 ", cnt, "번째 뉴스]")

    print(news.get_attribute("href"))

    cnt+=1

 

각 뉴스 기사 링크에 접속해보기

 

news_list = []

 

cnt = 1

for news in news_links:

    print("[오늘의 ", cnt, "번째 뉴스]")

    print(news.get_attribute("href"))

    news_list.append(news.get_attribute("href"))

    cnt+=1

 

for news in news_list:

    driver.get(news)

 

각 뉴스의 제목과 본문을 가져오기

 

driver.get(news_list[0])

news_title = driver.find_element(By.CLASS_NAME, 'NewsEndMain_article_title__kqEzS')

print(news_title)

print(news_title.text)

 

driver.find_element(By.CLASS_NAME, '_article_content')

print(driver.find_element(By.CLASS_NAME, '_article_content').text)

 

news_texts = driver.find_element(By.CLASS_NAME, '_article_content')

print(news_texts.text)

 

-----------------------------------------------------------

전체 기사별 제목과 본문 한번에 가져오기

 

import time

news_content_list = []
for news in news_list:
    news_content = dict()
    # 뉴스 링크 접속
    driver.get(news)
    time.sleep(2) # 사이트가 로딩될 때 까지 기다림
    # 뉴스 제목 가져오기
    news_title = driver.find_element(By.CLASS_NAME, 'NewsEndMain_article_title__kqEzS')
    news_content['title'] = news_title.text
    # 뉴스 본문 가져오기
    news_texts = driver.find_element(By.CLASS_NAME, '_article_content')
    news_content['main_text'] = news_texts.text
    news_content_list.append(news_content)
 
print(news_content_list)
print(news_content_list[0])
 
------------------------------------------------------------
 

긁어온 기사들을 ChatGPT로 요약

 
import os
os.environ["OPENAI_API_KEY"] = "sk-..."
 
from openai import OpenAI
client = OpenAI()
 
completion = client.chat.completions.create(
  model="gpt-4o-mini", #gpt-3.5-turbo-0125
  messages=[
    {"role": "user", "content": "안녕"}
  ]
)
 
print(completion.choices[0].message)
print(completion.choices[0].message.content)

 

print(news_content_list[0]['title'])

ptint(news_content_list[0]['main_text'])

 

completion = client.chat.completions.create(

  model="gpt-4o-mini", #gpt-3.5-turbo-0125

  messages=[

      {"role": "user", "content":

       """아래 뉴스 내용을 읽고, 핵심내용을 파악하여 2줄 정도로 요약해주세요. 그리고 이 뉴스기사를 통해 후속 기사는 어떤 내용일 지 추론해 알려주세요.

       뉴스 제목 : {}

       뉴스 본문 : {}

       """.format(news_content_list[0]['title'], news_content_list[0]['main_text'])}

  ]

)

print(completion.choices[0].message)

 

print(completion.choices[0].message.content)

-----------------------------------------------------------------------

결과물 구글 스프레드 시트에 저장

 
import gspread
 
json_file_path = "./key.json"
gc = gspread.service_account(json_file_path)
doc = gc.open_by_url(spreadsheet_url)
 
worksheet = doc.worksheet("시트1")
worksheet.update_acell('A1','자동화 완료!')
for idx, news_content in enumerate(news_content_list):
    completion = client.chat.completions.create(
      model="gpt-4o-mini", #gpt-3.5-turbo-0125
      messages=[
          {"role": "user", "content":
           """아래 뉴스 내용을 읽고, 핵심내용을 파악하여 2줄 정도로 요약해주세요. 그리고 이 뉴스기사를 통해 후속 기사는 어떤 내용일 지 추론해 알려주세요.
           뉴스 제목 : {}
           뉴스 본문 : {}
           """.format(news_content['title'], news_content['main_text'])}
      ]
    )

    print(completion.choices[0].message.content)
    worksheet = doc.worksheet("시트2")
    ## 제목 업데이트
    worksheet.update_acell('A{}'.format(idx+2),news_content['title'])
    ## 본문 업데이트
    worksheet.update_acell('B{}'.format(idx+2),news_content['main_text'])
    ## ChatGPT 결과물 업데이트
    worksheet.update_acell('C{}'.format(idx+2),completion.choices[0].message.content)

 

---------------------------------------------------------------

D 열에 뉴스 기사 url  추가

 

for idx, news_content in enumerate(news_content_list):

    completion = client.chat.completions.create(

      model="gpt-4o-mini", #gpt-3.5-turbo-0125

      messages=[

          {"role": "user", "content":

           """아래 뉴스 내용을 읽고, 핵심내용을 파악하여 2줄 정도로 요약해주세요. 그리고 이 뉴스기사를 통해 후속 기사는 어떤 내용일 지 추론해 알려주세요.

           뉴스 제목 : {}

           뉴스 본문 : {}

           """.format(news_content['title'], news_content['main_text'])}

      ]

    )

 

    print(completion.choices[0].message.content)

    worksheet = doc.worksheet("시트2")

    ## 제목 업데이트

    worksheet.update_acell('A{}'.format(idx+2),news_content['title'])

    ## 본문 업데이트

    worksheet.update_acell('B{}'.format(idx+2),news_content['main_text'])

    ## ChatGPT 결과물 업데이트

    worksheet.update_acell('C{}'.format(idx+2),completion.choices[0].message.content)

    ## 뉴스 링크 추가

    worksheet.update_acell('D{}'.format(idx+2),news_list[idx])

 

 

반응형

+ Recent posts