해결된 질문
작성
·
484
답변 3
2
아ㅏㅏㅏㅏㅏ 드디어 찾았다 !!!
보내주신 코드 185번째 라인을 봐주셔요
os_Platform이 Darwin인데 ~ Keys.CONTROL !!!!!이 되어있습니다
184번째줄에 잘 작성해주신것처럼
185번째줄 코드를 Keys.CONTROL => Keys.COMMAND로 고쳐주시면 됩니다
Control 키가 눌러져있는 상태로 OK 버튼을 누르셨는데, OK 버튼은 <a> 태그가 아닌지라 특정 링크로 연결되는 곳이 없어서, 갈곳잃은 브라우저는 오류페이지를 뱉어냈던겁니다 : )
1
퇴근해서 한번씩 실행해보는데 별걸 다 확인했네요..
혹시, 네이버 측에서 .click()으로하면 봇을 차단하나? 도 확인해보고 했었는데
문제 원인을 찾아서 다행입니다
차후에, 고급 크롤링으로 가시면
ActionChain을 활용해서
ActionChains(driver).scroll()
ActionChains(driver).move_to_element()
ActionChains(driver).move_by_offset() 등등 다양한 기능으로 개발하시게 될겁니다 !
혹시, 왕고고님은 이런 셀레니움 고급과정(사람처럼 활동하는 크롤러 개발)에 관심이 있으실까요 ?
0
안녕하세요 수강생 왕고고님 : )
서로이웃 신청 버튼 클릭시에 발생한 에러가 현재도 계속 지속적으로 발생되나요?
프로그램 코드도 함께 첨부해주시면 빠르게 도와드리겠습니다 !
안녕하세요! 코드 첨부해드립니다.
from tkinter import E
import pyperclip
import time
from selenium import webdriver
import chromedriver_autoinstaller
import data.loginInfo as loginData
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
import platform
import random
chromedriver_autoinstaller.install()
# print(platform.system())
os_Platform = platform.system()
# pipenv install chromedriver-autoinstaller
driver = webdriver.Chrome()
# ******************************************1. 로그인 시작*********************************************
def login_Driver(driver):
driver.get(
"https://nid.naver.com/nidlogin.login?mode=form&url=https%3A%2F%2Fwww.naver.com"
)
print(loginData.naverId)
my_id, my_pw = loginData.naverId, loginData.naverPassword
id_Selector = "#id"
pw_Selector = "#pw"
loginBtn_Selector = "#log\.login"
id_input = driver.find_element(By.CSS_SELECTOR, id_Selector)
pw_input = driver.find_element(By.CSS_SELECTOR, pw_Selector)
loginBtn = driver.find_element(By.CSS_SELECTOR, loginBtn_Selector)
id_input.click()
time.sleep(0.3)
pyperclip.copy(loginData.naverId)
time.sleep(0.3)
if os_Platform == "Darwin":
ActionChains(driver).key_down(Keys.COMMAND).send_keys("v").key_up(
Keys.CONTROL
).perform()
else:
ActionChains(driver).key_down(Keys.CONTROL).send_keys("v").key_up(
Keys.CONTROL
).perform()
pw_input.click()
time.sleep(0.3)
pyperclip.copy(my_pw)
time.sleep(0.3)
if os_Platform == "Darwin":
ActionChains(driver).key_down(Keys.COMMAND).send_keys("v").key_up(
Keys.CONTROL
).perform()
else:
ActionChains(driver).key_down(Keys.CONTROL).send_keys("v").key_up(
Keys.CONTROL
).perform()
time.sleep(0.5)
loginBtn.click()
# ******************************************2. 블로그 아이디 추출*********************************************
def extract_blog_id(driver, keyword, max_count=100):
search_link = f"https://search.naver.com/search.naver?query={keyword}&nso=&where=blog&sm=tab_opt"
# sp_blog_1 > div > div > a
driver.get(search_link)
# 스크롤 내림 진행
# _view_review_body_html > div > more-contents > div > ul
max_count = 100
postings_selector = "#_view_review_body_html > div > more-contents > div > ul > li"
postings = driver.find_elements(By.CSS_SELECTOR, postings_selector)
current_line = len(postings)
blog_id_list = []
while current_line < max_count:
time.sleep(0.2)
driver.execute_script("window.scrollBy(0,500);")
postings = driver.find_elements(By.CSS_SELECTOR, postings_selector)
current_line = len(postings)
# # 선택된 블로그 정보 파싱
# blogtitle_selector = f"#sp_blog_{current_line} > div > div > a"
# title_a_tag = driver.find_element(By.CSS_SELECTOR, blogtitle_selector)
# blog_url = title_a_tag.get_attribute("href")
# blog_id = blog_url.split("/")[-2]
# blog_id_list.append(blog_id)
# print(f"{blog_id}, URL : {blog_url}")
# ID, URL 추출
time.sleep(1.5)
for idx in range(1, max_count):
blogtitle_selector = f"#sp_blog_{idx} > div > div > a"
title_a_tag = driver.find_element(By.CSS_SELECTOR, blogtitle_selector)
blog_url = title_a_tag.get_attribute("href")
blog_id = blog_url.split("/")[-2]
blog_id_list.append(blog_id)
# print(f"{blog_id}")
# 추출된 블로거 계정 중복 제거
visited_account = []
# 이웃신청을 건 블로거의 계정 제거
with open("./already_done.txt", "r") as f:
_visited_account = f.readlines()
for v_account in _visited_account:
v_account = v_account.rstrip()
visited_account.append(v_account)
# 추가할 블로그 계정 중 이미 이웃신청건 계정을 제거
blog_ids = list(set(blog_id_list) - set(visited_account))
print(blog_ids)
with open("./blog_id_list.txt", "a") as f:
for blogid in blog_id_list:
f.write(f"{blogid}\n")
# ******************************************3. 서로이웃 추가*********************************************
def initialize():
with open("./blog_id_list.txt", "w") as f:
f.write("")
def add_buddy_send(driver):
f = open("./blog_id_list.txt", "r")
blog_ids = f.readlines()
f.close()
# print(blog_ids)
blog_ids = list(set(blog_ids))
for blog_id in blog_ids:
blog_id = blog_id.replace("\n", "")
add_buddy_link = f"https://m.blog.naver.com/BuddyAddForm.naver?blogId={blog_id}"
driver.get(add_buddy_link)
time.sleep(2)
#
both_add_buddy_btn_selector = "#bothBuddyRadio"
# 0. 이미 서로이웃 신청 한 상황
try:
# 버튼이 존재할때
both_add_buddy_btn = driver.find_element(
By.CSS_SELECTOR, both_add_buddy_btn_selector
)
except Exception as e:
# 버튼이 존재하지 않을때
print(e)
continue
both_add_buddy_btn = driver.find_element(
By.CSS_SELECTOR, both_add_buddy_btn_selector
)
disabled = both_add_buddy_btn.get_attribute("disabled")
# 1. 서로이웃 가능 확인 diabled = None, True
if disabled == "true":
continue
both_add_buddy_btn.click()
time.sleep(random.randrange(3, 7) / 10)
# 2. 정상 실행 시작
# 2-1. 서로 이웃 멘트 작성
comments = "안녕하세요. 앞으로 서로이웃으로 친하게 지냈으면 좋겠습니다. "
pyperclip.copy(comments)
comment_selector = "#buddyAddForm > fieldset > div > div.set_detail_t1 > div.set_detail_t1 > div > textarea"
comment_area = driver.find_element(By.CSS_SELECTOR, comment_selector)
comment_area.click()
comment_area.clear()
comment_area.click()
time.sleep(random.randrange(3, 7) / 10)
if os_Platform == "Darwin":
ActionChains(driver).key_down(Keys.COMMAND).send_keys("v").key_up(
Keys.CONTROL
).perform()
else:
ActionChains(driver).key_down(Keys.CONTROL).send_keys("v").key_up(
Keys.CONTROL
).perform()
time.sleep(0.5)
# 2-2. 서로이웃 추가 클릭
time.sleep(0.5)
ok_btn_selector = "body > ui-view > div.head.type1 > a.btn_ok"
ok_btn = driver.find_element(By.CSS_SELECTOR, ok_btn_selector)
ok_btn.click()
time.sleep(0.5)
# 이미 추가한 블로그 아이디 리스트에 추가
with open("./already_done.txt", "a") as f:
f.write(f"{blog_id}\n")
time.sleep(random.randrange(6, 8))
initialize()
login_Driver(driver)
# 여러개의 키워드에서 이웃을 추출
keywords = ["자동화 수익", "패시브 인컴"]
try:
for keyword in keywords:
extract_blog_id(driver, keyword, max_count=90)
add_buddy_send(driver)
except Exception as e:
print(f"Add_Buddy_Send Error : {e}")
input()
와ㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏ
이런대박실수를.. 확인감사합니다 :)