본문 바로가기
개발/Python

[py] 네이버 블로그 이웃 추가 자동화

by 코딩하는 갓디노 2022. 10. 11.

[py] 네이버 블로그 이웃 추가 자동화

 

1, 2, 3단계에 걸친
네이버 블로그 이웃추가 자동화입니다. 

 

구현내용

flow

  • 네이버 로그인 자동화
  • 모바일 페이지 검색후 뷰탭으로 이동
  • 검색 옵션은 블로그, 최신순 쿼리 주소
  • 첫번째 포스팅 블로그 아이디 클릭
  • 이웃 추가 버튼 클릭(가능할때만 - 이미 이웃인 상태, 이웃 받지 않을 경우 불가능)
  • 서로 이웃 버튼 클릭(서로 이웃 신청 받지 않을 경우 불가능)
  • 이웃 신청 멘트 기존의 것 삭제 후 새로운 멘트 작성
  • 확인 클릭

 

1단계

  • 1명 자동으로 이웃 추가

 

2단계

  • 처음 로딩된 페이지 내 모든 이웃 자동으로 이웃 추가

 

3단계

  • n명 만큼 자동으로 이웃 추가

 

1단계

  • try, except 구문으로 예외 처리하는 이유: (서로)이웃추가 금지로 이웃추가가 안되는 경우를 처리해야 함
  • 이웃추가 버튼, 서로이웃추가 버튼 클릭이 안될 경우이므로 이 상단에 try 위치 시킴
#셀레니움 기본설정
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager #크롬 드라이버 자동 업데이트
from selenium.webdriver.common.by import By 
from selenium.webdriver.common.keys import Keys #textarea 입력 삭제

#자동입력 방지 문자 알림창 방지 위해 3가지 import
import time
import pyautogui
import pyperclip

chrome_options = Options() #브라우저 꺼짐 방지
chrome_options.add_experimental_option("detach", True)
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"]) #불필요한 에러 메세지 삭제

service = Service(executable_path = ChromeDriverManager().install()) #크롬 드라이버 최신 버전 자동 설치 후 서비스 만들기
driver = webdriver.Chrome(service = service, options = chrome_options)

driver.implicitly_wait(5) #사이트 로딩시간 5초 기다림
driver.maximize_window() #화면 최대화(꽉차게)
driver.get("https://nid.naver.com/nidlogin.login?mode=form&url=https%3A%2F%2Fwww.naver.com") #웹페이지 해당 주소 이동

id = driver.find_element(By.CSS_SELECTOR, '#id') #아이디 입력창
id.click()
#id.send_keys('네이버 아이디') - 아래 코드로 변경
pyperclip.copy('아이디')
pyautogui.hotkey('ctrl', 'v')
time.sleep(1)

pw = driver.find_element(By.CSS_SELECTOR, '#pw') #아이디 입력창
pw.click()
#pw.send_keys('네이버 비밀번호') - 아래 코드로 변경
pyperclip.copy('비번')
pyautogui.hotkey('ctrl', 'v')
time.sleep(1)

driver.find_element(By.CSS_SELECTOR, '.btn_login').click()
time.sleep(1)

#키워드: 육아
search_url = 'https://m.search.naver.com/search.naver?where=m_blog&query=%EC%9C%A1%EC%95%84&sm=mtb_viw.blog&nso=so%3Add%2Cp%3Aall'
driver.get(search_url)
time.sleep(1)

#블로거 클릭
driver.find_element(By.CSS_SELECTOR, '.sub_txt.sub_name').click()
time.sleep(1)

try:
    #이웃 추가 클릭
    driver.find_element(By.CSS_SELECTOR, '.link__RsHMX.add_buddy_btn__oGR_B').click()
    time.sleep(1)

    #서로이웃추가 클릭
    driver.find_element(By.CSS_SELECTOR, '#bothBuddyRadio').click()

    #이웃 추가 메시지 전송
    msg = '관심 분야가 같아 이웃 신청합니다. 반갑습니다.'
    textarea = driver.find_element(By.CSS_SELECTOR, '.textarea_t1')
    textarea.send_keys(Keys.CONTROL, 'a') #전체선택
    time.sleep(1)
    textarea.send_keys(Keys.DELETE) #삭제
    time.sleep(1)
    textarea.send_keys(msg) #메시지 입력
    driver.find_element(By.CSS_SELECTOR, '.btn_ok').click()
except:
    pass #아무것도 실행 안함

 

2단계

#셀레니움 기본설정
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager #크롬 드라이버 자동 업데이트
from selenium.webdriver.common.by import By 
from selenium.webdriver.common.keys import Keys #textarea 입력 삭제

#자동입력 방지 문자 알림창 방지 위해 3가지 import
import time
import pyautogui
import pyperclip

chrome_options = Options() #브라우저 꺼짐 방지
chrome_options.add_experimental_option("detach", True)
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"]) #불필요한 에러 메세지 삭제

service = Service(executable_path = ChromeDriverManager().install()) #크롬 드라이버 최신 버전 자동 설치 후 서비스 만들기
driver = webdriver.Chrome(service = service, options = chrome_options)

driver.implicitly_wait(5) #사이트 로딩시간 5초 기다림
driver.maximize_window() #화면 최대화(꽉차게)
driver.get("https://nid.naver.com/nidlogin.login?mode=form&url=https%3A%2F%2Fwww.naver.com") #웹페이지 해당 주소 이동

id = driver.find_element(By.CSS_SELECTOR, '#id') #아이디 입력창
id.click()
#id.send_keys('네이버 아이디') - 아래 코드로 변경
pyperclip.copy('아이디')
pyautogui.hotkey('ctrl', 'v')
time.sleep(1)

pw = driver.find_element(By.CSS_SELECTOR, '#pw') #아이디 입력창
pw.click()
#pw.send_keys('네이버 비밀번호') - 아래 코드로 변경
pyperclip.copy('비번')
pyautogui.hotkey('ctrl', 'v')
time.sleep(1)

driver.find_element(By.CSS_SELECTOR, '.btn_login').click()
time.sleep(1)

#키워드: 육아
search_url = 'https://m.search.naver.com/search.naver?where=m_blog&query=%EC%9C%A1%EC%95%84&sm=mtb_viw.blog&nso=so%3Add%2Cp%3Aall'
driver.get(search_url)
time.sleep(1)

#전체 페이지 내 블로거들
ids = driver.find_elements(By.CSS_SELECTOR, '.sub_txt.sub_name')
time.sleep(1)

for id in ids:
    #블로거 클릭
    # id.click()
    # time.sleep(1)
    #새창으로 열고 드라이버 전환 안하면 stale element reference: element is not attached to the page document
    #블로거 클릭시 다른 페이지로 이동되기 때문에 url이 바뀌어서 id.click()를 못함

    #해당 id의 페이지를 새창으로 열기
    id.send_keys(Keys.CONTROL + '\n')

    #새창으로 드라이버 전환
    all_windows = driver.window_handles #드라이버가 열린 모든 창 가지고 옴
    driver.switch_to.window(all_windows[1]) #드라이버가 제어하는 윈도우 설정(all_windows[1] 새창 (all_windows[0] 기존창
    time.sleep(2)

    try:
        #이웃 추가 클릭
        driver.find_element(By.CSS_SELECTOR, '.link__RsHMX.add_buddy_btn__oGR_B').click()
        time.sleep(1)

        #서로이웃추가 클릭
        driver.find_element(By.CSS_SELECTOR, '#bothBuddyRadio').click()

        #이웃 추가 메시지 전송
        msg = '관심 분야가 같아 이웃 신청합니다. 반갑습니다.'
        textarea = driver.find_element(By.CSS_SELECTOR, '.textarea_t1')
        textarea.send_keys(Keys.CONTROL, 'a') #전체선택
        time.sleep(1)
        textarea.send_keys(Keys.DELETE) #삭제
        time.sleep(1)
        textarea.send_keys(msg) #메시지 입력
        driver.find_element(By.CSS_SELECTOR, '.btn_ok').click()
    except:
        pass #아무것도 실행 안함

    #새창 닫기
    driver.close()

    #기존 창으로 드라이버 전환
    driver.switch_to.window(all_windows[0])

 

3단계

  • 구조상 페이지별 페이지번호를 클릭하는 것이 아니라 무한스크롤로 이웃을 클릭하면 아래 스크롤이 내려가는 타입
  • 필요한 것은 페이지 개수가 아니라 클릭한 총 이웃 신청 개수
  • 필요한 변수 정의: 총 이웃 신청 개수, 현재 이웃 신청 개수, 현재 블로그 글번호
  • 2단계의 for id in ids를 삭제하고, id 찾는 방법은 현재 블로그 글번호로 찾기
  • while문으로 반복문 사용 
#셀레니움 기본설정
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager #크롬 드라이버 자동 업데이트
from selenium.webdriver.common.by import By 
from selenium.webdriver.common.keys import Keys #textarea 입력 삭제

#자동입력 방지 문자 알림창 방지 위해 3가지 import
import time
import pyautogui
import pyperclip

chrome_options = Options() #브라우저 꺼짐 방지
chrome_options.add_experimental_option("detach", True)
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"]) #불필요한 에러 메세지 삭제

service = Service(executable_path = ChromeDriverManager().install()) #크롬 드라이버 최신 버전 자동 설치 후 서비스 만들기
driver = webdriver.Chrome(service = service, options = chrome_options)

driver.implicitly_wait(5) #사이트 로딩시간 5초 기다림
driver.maximize_window() #화면 최대화(꽉차게)
driver.get("https://nid.naver.com/nidlogin.login?mode=form&url=https%3A%2F%2Fwww.naver.com") #웹페이지 해당 주소 이동

id = driver.find_element(By.CSS_SELECTOR, '#id') #아이디 입력창
id.click()
#id.send_keys('네이버 아이디') - 아래 코드로 변경
pyperclip.copy('아이디')
pyautogui.hotkey('ctrl', 'v')
time.sleep(1)

pw = driver.find_element(By.CSS_SELECTOR, '#pw') #아이디 입력창
pw.click()
#pw.send_keys('네이버 비밀번호') - 아래 코드로 변경
pyperclip.copy('비번')
pyautogui.hotkey('ctrl', 'v')
time.sleep(1)

driver.find_element(By.CSS_SELECTOR, '.btn_login').click()
time.sleep(1)

#키워드: 육아
search_url = 'https://m.search.naver.com/search.naver?where=m_blog&query=%EC%9C%A1%EC%95%84%EC%9D%BC%EA%B8%B0&sm=mtb_viw.blog&nso=so%3Add%2Cp%3Aall'
driver.get(search_url)
time.sleep(1)

n = 10 #총 이웃신청 개수
count = 0 #현재 이웃 신청개수
index = 0 #현재 블로그 글 번호

while count < n: #count가 n가 같을때 false
    #전체 페이지 내 블로거들
    ids = driver.find_elements(By.CSS_SELECTOR, '.sub_txt.sub_name')

    #현재 블로그 글 index에 맞는 아이디 찾기
    id = ids[index]

    #새창으로 열기
    id.send_keys(Keys.CONTROL + '\n')

    #새창으로 드라이버 전환
    all_windows = driver.window_handles #드라이버가 열린 모든 창 가지고 옴
    driver.switch_to.window(all_windows[1]) #드라이버가 제어하는 윈도우 설정(all_windows[1] 새창 (all_windows[0] 기존창
    time.sleep(2)

    try:
        #이웃 추가 클릭
        driver.find_element(By.CSS_SELECTOR, '.link__RsHMX.add_buddy_btn__oGR_B').click()
        time.sleep(1)

        #서로이웃추가 클릭
        driver.find_element(By.CSS_SELECTOR, '#bothBuddyRadio').click()

        #이웃 추가 메시지 전송
        msg = '관심 분야가 같아 이웃 신청합니다. 반갑습니다.'
        textarea = driver.find_element(By.CSS_SELECTOR, '.textarea_t1')
        textarea.send_keys(Keys.CONTROL, 'a') #전체선택
        time.sleep(1)
        textarea.send_keys(Keys.DELETE) #삭제
        time.sleep(1)
        textarea.send_keys(msg) #메시지 입력
        driver.find_element(By.CSS_SELECTOR, '.btn_ok').click()
        count = count + 1 #서로이웃 신청개수 증가
    except:
        pass #아무것도 실행 안함

    #새창 닫기
    driver.close()

    #기존 창으로 드라이버 전환
    driver.switch_to.window(all_windows[0])
    index = index + 1 #현재 블로그 글번호 증가
반응형

댓글