작성
·
17
·
수정됨
0
안녕하세요
강사님 덕분에 그동안 무척 배우고 싶었던 크롤링과 데이터 수집 방법에 대해 많이 배우고 있어서 감사할 따름입니다.
다름이 아니라 네이버 자동화 로그인 과정에서 중복방지문자가 계속 나타나서 질문 드립니다.
time.sleep으로 시간도 길게 했고, 시간을 충분히 가진 후(이틀 후)에도 시도했으나 계속해서 중복방지문자가 나타나서 질문드립니다.
혹시 이제 클립보드 복사 붙여넣기의 로그인 방법이 막힌건가요?
그리고 마지막으로 코드 전체를 합쳐서 실행했을 때 ElementClickInterceptedException, NoSuchElementException 오류가 계속 나타나 오류가 뜨는 대부분의 버튼에 명시적 대기를 걸어줬는데,
이렇게 코드를 한꺼번에 실행하려 했을 때는 대부분의 과정마다 모두 명시적 대기를 걸어줘야 하는지도 궁금합니다!
user_id = "************"
user_pw = "************"
# 셀레니움 기본 템플릿
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
import pyperclip
import random
# 크롬 드라이버 생성
driver = webdriver.Chrome()
# 페이지 이동
driver.get("https://nid.naver.com/nidlogin.login?mode=form&url=https://www.naver.com/")
random_sec = random.uniform(3, 5)
# 아이디 입력
id = driver.find_element(By.CSS_SELECTOR, "#id")
pyperclip.copy(user_id)
id.send_keys(Keys.CONTROL, 'v')
time.sleep(random_sec)
# 비밀번호 입력
pw = driver.find_element(By.CSS_SELECTOR, "#pw")
pyperclip.copy(user_pw)
pw.send_keys(Keys.CONTROL, 'v')
pw.send_keys(user_pw)
time.sleep(random_sec)
# 로그인 버튼 클릭
driver.find_element(By.CSS_SELECTOR, "#log\.login\.text").click()
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver.switch_to.window(driver.window_handles[0])
# 네이버 메인 페이지 이동
driver.get("https://www.naver.com")
# 드롭다운 메뉴 클릭
driver.find_element(By.CSS_SELECTOR, "#account > div.MyView-module__my_menu___eF24q > div > div > ul > li:nth-child(1) > a > span.MyView-module__item_text___VTQQM").click()
# driver.implicitly_wait(10) -> 암시적 대기는 요소가 나타날 때까지만 기다려주는 것일뿐, 클릭가능한상태까지 기다려주진않음
wait = WebDriverWait(driver, 5)
# 메일함 버튼 클릭
# driver.find_element(By.CSS_SELECTOR, "#account > div.MyView-module__layer_menu_service___NqMyX > div.MyView-module__service_sub___wix9p > div.MyView-module__sub_left___AIWHR > a").click()
# -> 이 코드에서 오류가 뜨는 이유는 드롭다운 메뉴가 나타나기도 전에 이 코드가 실행돼서 그럼 -> 명시적 대기를 걸어줘야 함
mail_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#account > div.MyView-module__layer_menu_service___NqMyX > div.MyView-module__service_sub___wix9p > div.MyView-module__sub_left___AIWHR > a")))
# -> 요소를 찾아 클릭가능한 상태까지 최대 5초간 기다려줌
# mail_button.click()
driver.execute_script("arguments[0].click();", mail_button)
# 새창으로 전환
driver.switch_to.window(driver.window_handles[1])
# 메일쓰기 버튼 클릭
# driver.find_element(By.CSS_SELECTOR, "#root > div > nav > div > div.lnb_header > div.lnb_task > a.item.button_write").click()
write_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#root > div > nav > div > div.lnb_header > div.lnb_task > a.item.button_write")))
write_button.click()
receiver = "wjddudtn1618@naver.com"
# 받는사람 입력
# receiver_blank = driver.find_element(By.CSS_SELECTOR, "#recipient_input_element")
# receiver_blank.click()
receiver_blank = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#recipient_input_element")))
receiver_blank.click()
receiver_blank.send_keys(receiver)
# 제목 입력
title = "안녕"
title_blank = driver.find_element(By.CSS_SELECTOR, "#subject_title")
title_blank.click()
title_blank.send_keys(title)
# iframe으로 전환
iframe = driver.find_element(By.CSS_SELECTOR, "#content > div.contents_area > div > div.editor_area > div > div.editor_body > iframe")
driver.switch_to.frame(iframe)
body = "메일 자동화 프로그램 테스트하는 중인데, 메일 리스트에 너가 있길래 한번 보내봤어"
body_blank = driver.find_element(By.CSS_SELECTOR, "body > div > div.workseditor-body > div.workseditor-content")
body_blank.click()
body_blank.send_keys(body)
# 원래 페이지로 전환
driver.switch_to.default_content()
# 메일 보내기
driver.find_element(By.CSS_SELECTOR, "#content > div.mail_toolbar.type_write > div:nth-child(1) > div > button.button_write_task").click()
# driver.find_element(By.CSS_SELECTOR, "#layer > div > div > div > div.button_area > div.button_area_inner > button.button_send").click()
confirm_send_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#layer button.button_send")))
confirm_send_button.click()
답변 2
0
네이버 로그인 잘 되고 있어요~
pw.send_keys(user_pw)
보시면 패스워드를 2번 입력하도록 코드가 구성되어 있네요
그리고 메일자동화 합칠 때,
명시적 대기 걸어줄 필요 없이 time.sleep 만 적절하게 1, 2초 씩 줘도 잘 동작합니다.
감사합니다. 평안한 하루 되세요 :)
0
안녕하세요, 인프런 AI 인턴입니다. wjddudtn1618님.
네이버 자동화 로그인 과정에서 중복 방지 문자가 자주 나타나고, 명시적 대기에 관련된 문제로 어려움을 겪고 계신 것 같군요. 몇 가지 개선 방법을 제안드리겠습니다.
중복 방지 문자는 자동화된 로그인을 방지하기 위한 네이버의 보안 조치 중 하나입니다. 이러한 방지문자가 발생하는 것은 자연스러운 현상이며, 기본적으로 완전한 우회 방법은 없습니다. 기존의 클립보드 복사 붙여넣기 방법도 막힐 가능성이 있습니다. 일반적으로 이 문제를 해결하기 위해서는 다음의 방법을 고려할 수 있습니다:
명시적 대기를 언제나 사용해야 하는 것은 아닙니다. 그러나, 페이지의 로드나 요소의 로딩 상태가 일정하지 않을 때 명시적 대기를 사용하면 안정성을 크게 높일 수 있습니다. 현재 문제는 요소가 완전히 로드되지 않기 전에 액션을 수행하려고 해서 발생할 수 있습니다. 명시적 대기를 사용하는 것은 좋은 접근이며, 특히 웹 페이지 상의 특정 요소가 로드되기 전에 발생할 수 있는 오류를 방지합니다.
다음과 같은 점들을 고려하세요:
presence_of_element_located
는 요소가 페이지에 존재하기만 하면 통과합니다. 액션(클릭 등)을 바로 수행할 필요가 있다면 element_to_be_clickable
같은 조건을 사용하셔야 합니다.관련된 기존 질문이 있으니 참고하시면 도움이 될 것 같습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
앗..비밀번호가 계속 틀린거였군요.. 코드 다시 한번 제대로 확인했어야 했는데..
time.sleep으로도 한번 실행해보겠습니다!
답변 감사합니다!