나의 분석일기 ♬

[웹 크롤링]네이버 블로그 업로드 자동화(SELENIUM & ChatGPT) 본문

데이터 분석/Crawling

[웹 크롤링]네이버 블로그 업로드 자동화(SELENIUM & ChatGPT)

Screening Jang 2024. 5. 30. 14:05

[웹 크롤링]네이버 블로그 업로드 자동화(SELENIUM & ChatGPT)

1. 필요한 라이브러리 불러오기

import selenium
import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import pyperclip #복붙에 사용할 모듈
from selenium.webdriver.common.keys import Keys # ctrl + v 를 위해 
import getpass #민감한 정보를 입력받는 모듈

2. 네이버 로그인 함수

def login_naver(id_, pw_):
    driver = webdriver.Chrome()
    driver.get("https://www.naver.com/")
    time.sleep(3)
    driver.find_element(By.XPATH, '//*[@id="account"]/div/a').click()
    pyperclip.copy(id_)# 클립 보드로 복사됨 
    driver.find_element(By.CSS_SELECTOR, "#id").click()
    driver.find_element(By.CSS_SELECTOR, "#id").send_keys(Keys.CONTROL, "v") # 붙여넣기
    time.sleep(2)

    pyperclip.copy(pw_)# 클립 보드로 복사됨 
    driver.find_element(By.CSS_SELECTOR, "#pw").click()
    driver.find_element(By.CSS_SELECTOR, "#pw").send_keys(Keys.CONTROL, "v") # 붙여넣기
    time.sleep(2)
    driver.find_element(By.CSS_SELECTOR, "#log\.login").click()
    return driver

3. 포스팅 함수

def posting(driver, id_, posttitle, postdes):
    driver.get(f"https://blog.naver.com/{id_}?Redirect=Write")
    frame = driver.find_element(By.ID, "mainFrame")
    driver.switch_to.frame(frame)
    time.sleep(4)

    # 작성중인 글 취소
    try:
        cancel_2 =driver.find_element(By.CSS_SELECTOR, ".se-popup-button.se-popup-button-cancel")
        if cancel_2:
            cancel_2.click()
    except:
        pass
        
    cancel_1 = driver.find_element(By.CSS_SELECTOR, '.se-help-panel-close-button')
    cancel_1.click()
    
    title = driver.find_element(By.CSS_SELECTOR, ".se-placeholder.__se_placeholder.se-fs32")
    action = ActionChains(driver)
    post_title = posttitle
    action.move_to_element(title).pause(1).click().send_keys(post_title).perform()
    print("제목 작성 완료")
    
    description = driver.find_element(By.CSS_SELECTOR, "span.se-placeholder.__se_placeholder.se-fs15")
    action = ActionChains(driver)
    post_description = postdes
    action.move_to_element(description).pause(1).click().send_keys(post_description).perform()
    print("내용 작성 완료")
    
    send = driver.find_elements(By.TAG_NAME, "button")[3]
    send.click()
    time.sleep(1)
    
    post = driver.find_elements(By.TAG_NAME, "button")[9]
    post.click()

4. 한국 경제 기사 크롤링, 챗GPT 답변 할당 함수

def hksearch(item, page):
    for i in range(1, page+1):
        hankyung_url = f"https://search.hankyung.com/search/news?query={item}&page={page}"
        hankyung_raw = requests.get(hankyung_url)
        hankyung_bs = bs(hankyung_raw.text, 'html.parser')
        for i in hankyung_bs.find("div",{"class": "section_cont"}).find_all("li"):
            result.append(i.find('em', class_='tit').text)
        result_string = "\n".join(result)
        return result_string

def openaisearch(item, result_string):
    crawlled = f"{result}"
    from openai import OpenAI
    client = OpenAI(api_key = openai_api_key)
    crawlled = f"{result_string}"
    message_list = [
        {"role":"system", "content":f"{item}와 관련된 뉴스이다. 해당 뉴스에 대한 요약과 이를 통한 종합적인 투자 의견을 제시하고 관련 주를 정리해줘. 해당 내용을 블로그에 개시하기 위해 제목, 내용으로 작성해줘"},
        {"role":"user","content":crawlled}
    ]
    
    complection = client.chat.completions.create(
        model = "gpt-4o",
        messages = message_list
    )
    posttitle = complection.choices[0].message.content.split("\n\n")[1].split("제목:")[1]
    postdes = "<br><br>".join(complection.choices[0].message.content.split("\n\n")[2:])
    return posttitle, postdes
  • hksearch함수

검색어와 페이지수를 입력하면 한국 경제 사이트에서 해당 검색어를 입력받아 나온 기사들을 입력받은 페이지 수 만큼 크롤링

  • openaisearch함수

크롤링된 기사들을 챗GPT에 입력해 요약과 종합적인 투자의견을 물어본 후 출력된 답변을 특정 변수에 저장

※ open api key는 따로 발급받아 사용

5. 코드 실행

id_ = getpass.getpass("id: ")
pw_ = getpass.getpass("pw: ")
item = input("검색어를 입력하세요.")
page = int(input("몇 페이지까지 검색할건가요?"))
result = []
driver = login_naver(id_, pw_)
result_string = hksearch(item, page)
posttitle, postdes = openaisearch(item, result_string)
posting(driver, id_, posttitle, postdes)

성공적으로 된 것을 알 수 있음

다만, 파이썬 문장 형식으로 출력된 답변을 그대로 작성함. 추후 html 형식에 맞게 맞춰주는 작업을 진행하면 더 예쁘게 포스팅할 수 있을 것 같음

'데이터 분석 > Crawling' 카테고리의 다른 글

[웹 크롤링]OPEN API  (0) 2024.05.30
[웹 크롤링]동적 웹 크롤링  (0) 2024.05.30
[웹 크롤링]정적 웹 크롤링  (0) 2024.05.29
[웹 크롤링]웹 크롤링 기초  (0) 2024.05.28
Comments