나의 분석일기 ♬
[웹 크롤링]네이버 블로그 업로드 자동화(SELENIUM & ChatGPT) 본문
[웹 크롤링]네이버 블로그 업로드 자동화(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