파이썬 셀레늄 네이버 포스트 자동 포스팅 방법
오랜만에 블로그 포스팅을 하게 되어서 기쁘게 생각합니다. 최근에는 GPT 포 등과 같은 기술들에 대한 이야기가 많이 나오고 있는 것 같습니다. 이로 인해 이제는 네이버 블로그나 텍스트 기반의 글쓰기가 크게 변화할 것이라고 생각합니다. 이미 몇몇 부분에서는 변화가 이루어지고 있습니다. 그렇지만 개인적으로는 여전히 이러한 방식으로 그냥 말로 글을 쓰는 것이 더 좋다고 생각합니다. 그래서 앞으로도 이 방식으로 글을 공유할 예정입니다.
오늘은 네이버 포스트를 통해 자동 포스팅하는 방법에 대해 약간 소개해드리고자 합니다. 이 방법은 처음 듣는 분들도 많을 것 같습니다. 특히 네이버 블로그를 자동화하여 글을 쓰시는 분들도 있을 것입니다. 네이버 포스트에서도 이와 같은 자동화 방법을 사용할 수 있습니다. 이를 위해 주로 사용되는 방법은 Python의 Selenium 라이브러리를 사용하여 이미지와 텍스트 등을 삽입하는 것입니다.
아래는 이 방법을 간략히 설명한 것입니다. 먼저 크롬 드라이버를 구동하여 크롬을 실행합니다. 이 때 디버깅 모드 방식으로 실행합니다. 그리고 네이버 사이트에 로그인하여 포스트 글쓰기를 할 수 있는 페이지로 이동합니다. 이제 글쓰기를 위한 작성 페이지에 들어가서 글을 작성하면 됩니다. 이와 같은 방법을 사용하면 자동화된 글쓰기를 할 수 있습니다.
그리고 마지막으로는 이제 글을 쓴 후에 이제 업로드를 하는 부분이 됩니다. 이 부분은 약간 좀 간단하게는 할 수 있겠지만 실제로도 이제 어떤 문제점들이 있을 수도 있고요. 그래서 이런 것들에 대해서는 좀 조금 더 공부를 해서 자신이 하시려는 작업에 맞게끔 약간 수정을 해야 될 수도 있다는 것들이 있을 거예요.
이렇게 보면 자동 포스팅이 굉장히 간단하고 쉬운 일처럼 보일 수 있지만 실제로는 그렇게 간단하지 않다는 것을 알 수 있습니다. 여러분들이 이러한 자동 포스팅을 하기 위해서는 프로그래밍 언어에 대한 기본 지식과 함께 웹 개발과 관련된 지식들이 필요합니다.
그래도 이러한 자동 포스팅 기능을 응용하면 블로그 포스팅을 조금 더 효율적으로 할 수 있고, 시간을 절약할 수 있기 때문에 도움이 될 것입니다. 이상으로 오늘은 네이버 포스트를 통한 자동 포스팅에 대해서 알아보았습니다. 다음에는 블로그 운영에 있어서 유용한 다른 팁들에 대해서도 알아보겠습니다. 감사합니다.
# import gspread
from oauth2client.service_account import ServiceAccountCredentials
import os
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
from googleapiclient.http import MediaFileUpload
from __future__ import print_function
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
import warnings
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.common.exceptions import NoSuchElementException,StaleElementReferenceException
from bs4 import BeautifulSoup
import time
import pyperclip
import requests
import datetime
import pymssql
import pandas as pd
from pandas.core.frame import DataFrame
import matplotlib.pyplot as plt
import chromedriver_autoinstaller
import subprocess
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.alert import Alert
import chromedriver_autoinstaller
import subprocess
import shutil
import xlrd
import openpyxl
import pygsheets
import csv
import re
import webbrowser
import os
import sys
import urllib.request
import json
from pandas.io.json import json_normalize
import hashlib
import hmac
import base64
import numpy as np
import autoit #autoit는 반드시 autoit 프로그램이 깔려있어야됨
import pyautogui
from PIL import ImageGrab
import glob
warnings.filterwarnings('ignore')
#try:
# shutil.rmtree(r"c:\chrometemp") #쿠키 / 캐쉬파일 삭제
#except FileNotFoundError:
# pass
subprocess.Popen(r'C:\Program Files\Google\Chrome\Application\chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\chrometemp"') # 디버거 크롬 구동
option = Options()
option.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
chrome_ver = chromedriver_autoinstaller.get_chrome_version().split('.')[0]
try:
driver = webdriver.Chrome(f'./{chrome_ver}/chromedriver.exe', options=option)
except:
chromedriver_autoinstaller.install(True)
driver = webdriver.Chrome(f'./{chrome_ver}/chromedriver.exe', options=option)
driver.maximize_window() #최대창
time.sleep(3)
driver.implicitly_wait(10)
action = ActionChains(driver) #액션지정
#네이버 이동
url = 'https://www.naver.com'
driver.get(url)
time.sleep(5)
driver.implicitly_wait(10)
driver.find_element_by_class_name('link_login').click()
time.sleep(1)
driver.implicitly_wait(10)
#id, pw 입력할 곳 찾기
tag_id = driver.find_element_by_name('id')
tag_pw = driver.find_element_by_name('pw')
driver.implicitly_wait(10)
#id 입력
tag_id.click()
pyperclip.copy('id')
tag_id.send_keys(Keys.CONTROL, 'v')
time.sleep(2)
driver.implicitly_wait(10)
#pw 입력
tag_pw.click()
pyperclip.copy('pw')
tag_pw.send_keys(Keys.CONTROL, 'v')
time.sleep(2)
driver.implicitly_wait(10)
#로그인 버튼 클릭
login_btn = driver.find_element_by_id('log.login')
login_btn.click()
time.sleep(1)
driver.implicitly_wait(10)
#등록안함 클릭
try :
driver.find_element_by_xpath('//*[@id="new.dontsave"]').click() #등록안함 클릭
except :
pass
time.sleep(1)
driver.implicitly_wait(10)
#네이버 포스트 주소로 이동
url = 'https://post.naver.com'
driver.get(url)
time.sleep(2)
driver.implicitly_wait(10)
#포스트 쓰기 버튼 클릭
post_btn = driver.find_element_by_xpath('//*[@id="header"]/div[1]/a[3]')
post_btn.click()
time.sleep(3)
driver.implicitly_wait(10)
#팝업 제거
#position = pyautogui.position() # 좌표 객체 얻기
#print(pyautogui.size()) #화면전체크기 확인하기
#while True : #마우스 위치 알아내기
# print( "Current Mouse Position : ", pyautogui.position())
# time.sleep(1)
# 좌표 위치 입력 (x, y, 버튼, 횟수, 간격)
#pyautogui.click(1368, 370, button='left', clicks=1, interval = 1 ) #팝업창 클릭(완료)
#time.sleep(2)
#driver.implicitly_wait(10)
################# 자동 포스팅
health_naver_posting = pd.read_excel('C:/Users/user/Desktop/folder/folder/blog_viewracle.xlsx')
for i in range(1, 16) :
url = 'https://post.editor.naver.com/editor'
driver.get(url) #생략
time.sleep(1) #생략
driver.implicitly_wait(10)
action = ActionChains(driver) #액션지정
try : #사이트 떠나기 엔터키 누르기*(사이트 나가기 창이 뜰시 기준)
# alert 창의 메시지를 확인하고 싶습니다.
alert = driver.switch_to.alert
message = alert.text
print("Alert shows following message: "+ message )
time.sleep(1)
# 메시지를 확인했으니 창을 닫습니다.
alert = driver.switch_to.alert
alert.accept() #에러 받아들이기
time.sleep(1)
driver.implicitly_wait(10)
driver.get(url)
time.sleep(1)
driver.send_keys(Keys.ENTER) #사이트 떠나기 엔터키 누르기
driver.implicitly_wait(10)
except :
print("no alert")
try :
# alert 창의 메시지를 확인하고 싶습니다.
alert = driver.switch_to.alert
message = alert.text
print("Alert shows following message: "+ message )
time.sleep(2)
# 메시지를 확인했으니 창을 닫습니다.
alert = driver.switch_to.alert
alert.dismiss() #무시하기
time.sleep(1)
driver.implicitly_wait(10)
except :
print("no alert")
time.sleep(1)
driver.implicitly_wait(10)
title_directory = health_naver_posting.loc[i]['title_2'] #제목
img_file_directory = health_naver_posting.loc[i]['img_directory'] #이미지
txt_file_directory = health_naver_posting.loc[i]['txt_directory'] #텍스트
img_dir = img_file_directory #이미지
f = open(txt_file_directory, 'r', encoding='utf-8') #메모장 파일열기
f_2 = open(txt_file_directory, 'r', encoding='utf-8') #메모장 파일열기
content_list = f.readlines() #본문
#blogger_title = content_list[0] #제목만
blogger_title = title_directory #제목만
blogger_title_2 = blogger_title.replace("\ufeff", "") #제목 필터링
content_desc = f_2.read() #본문
tistory_title = str(blogger_title_2) #제목
############ 네이버 포스트 제목 입력
iframes = driver.find_elements_by_tag_name('iframe')
driver.switch_to.frame(iframes[0])
#tag = str(tistory_title) #태그
tag_title = driver.find_element_by_xpath("//textarea[@placeholder='제목']") #Span 클래스 내 "제목" 단어 찾기
#tag_title = driver.find_element_by_xpath("//textarea[contains(@placeholder, '제목')]")
#tag_title = driver.find_element_by_xpath('//textarea[contains(text(),"제목")]')
#tag_title = driver.find_element_by_xpath("//textarea[@placeholder='제목' and @class='se_editable se_textarea']")
tag_title.click() # "제목" 클릭
time.sleep(1)
title = str(tistory_title)
time.sleep(1)
action.send_keys(title).perform() #입력
action = ActionChains(driver) #초기화
time.sleep(1)
driver.implicitly_wait(10)
#iframes = driver.find_elements_by_tag_name('iframe')
#print('현재 페이지에 iframe은 %d개가 있습니다.' % len(iframes))
#for i, iframe in enumerate(iframes):
# try:
# print('%d번째 iframe 입니다.' % i)
# # i 번째 iframe으로 변경합니다.
# driver.switch_to.frame(iframes[i])
# # 변경한 iframe 안의 소스를 확인합니다.
# print(driver.page_source)
# # 원래 frame으로 돌아옵니다.
# driver.switch_to.default_content()
# except:
# # exception이 발생했다면 원래 frame으로 돌아옵니다.
# driver.switch_to.default_content()
# # 몇 번째 frame에서 에러가 났었는지 확인합니다.
# print('pass by except : iframes[%d]' % i)
# # 다음 for문으로 넘어갑니다.
#tag_content = driver.find_element_by_xpath("//div[contains(text(),'내용을')]") #내용 태그
tag_content = driver.find_element_by_xpath("//div[@class='se_editView']") #내용 태그
tag_content.click()
time.sleep(1)
driver.implicitly_wait(10)
#### 소개말 넣기
content_1 = "안녕하세요? " +'\n'
action = ActionChains(driver) #초기화
action.send_keys(content_1).perform() #컨텐츠 입력
time.sleep(1)
driver.implicitly_wait(10)
#### 본문 내용 넣기
content_3_detail = str(content_desc) + '\n' + '\n'
action = ActionChains(driver) #초기화
action.send_keys(content_3_detail).perform() #컨텐츠 입력
time.sleep(1)
driver.implicitly_wait(10)
#### 이미지 넣기
driver.switch_to.default_content() # 아이프레임 빠져나오기
file_dir = health_naver_posting.loc[i]['directory'] + '/'
img_lists = glob.glob(str(file_dir)+'submit_img_*.jpg') #리스트화
for n in range(1, len(img_lists)):
pic_dir = img_lists[n] #해당 이미지 가져오기 (첫번째꺼는 제외)
pic_dir = pic_dir.replace("\\", "/") #디렉토리 수정
tag_picture = driver.find_element_by_xpath('//*[@id="se_side_comp_list"]/li[2]') #이미지 버튼 주소
tag_picture.click() #링크 버튼 클릭
time.sleep(2)
handle = "[CLASS:#32770; TITLE:열기]" #Basic Window info 값 handle 변수에 저장
autoit.win_wait_active("열기", 3) #이름이 '열기'인 창이 나올 때까지 3초간 대기
#img_path = "C:/Users/user/Desktop/test/image/test_"+str(keyword)+".jpg" #이미지경로
img_path = str(pic_dir) #이미지경로 변경
img_path_2 = img_path.replace('/', '\\') # 백슬래시는 두번 써야됨
autoit.control_send(handle, "Edit1", img_path_2) #사진 클릭시 나오는 윈도우 창에서 파일이름(N)에 이미지 경로값 전달
time.sleep(1)
autoit.control_click(handle, "Button1") #사진 클릭시 나오는 윈도우 창에서 Button1 클릭
time.sleep(1)
#최종 임시저장 클릭
driver.find_element_by_xpath('//*[@id="se_top_menu_area"]/div[1]/div[3]/ul/li[1]/div[1]').click() #저장 클릭
driver.close()
driver.quit()
댓글