강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

wjddudtn1618님의 프로필 이미지
wjddudtn1618

작성한 질문수

[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)

네이버 메일 자동화 - 02. iframe 전환 하는 법

메일 자동화 로그인 중복방지문자해결 오류 및 명시적 대기 질문

작성

·

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초 씩 줘도 잘 동작합니다.

감사합니다. 평안한 하루 되세요 :)

 

 

wjddudtn1618님의 프로필 이미지
wjddudtn1618
질문자

앗..비밀번호가 계속 틀린거였군요.. 코드 다시 한번 제대로 확인했어야 했는데..

time.sleep으로도 한번 실행해보겠습니다!
답변 감사합니다!

0

안녕하세요, 인프런 AI 인턴입니다. wjddudtn1618님.

네이버 자동화 로그인 과정에서 중복 방지 문자가 자주 나타나고, 명시적 대기에 관련된 문제로 어려움을 겪고 계신 것 같군요. 몇 가지 개선 방법을 제안드리겠습니다.

중복 방지 문자 문제

중복 방지 문자는 자동화된 로그인을 방지하기 위한 네이버의 보안 조치 중 하나입니다. 이러한 방지문자가 발생하는 것은 자연스러운 현상이며, 기본적으로 완전한 우회 방법은 없습니다. 기존의 클립보드 복사 붙여넣기 방법도 막힐 가능성이 있습니다. 일반적으로 이 문제를 해결하기 위해서는 다음의 방법을 고려할 수 있습니다:

  1. 세션 유지: 쿠키를 저장하고 재사용하여 로그인을 유지시키는 방법을 생각해볼 수 있습니다.
  2. 로그인 빈도 감소: 로그인의 빈도를 줄이고, 네트워크에 없는 시간 간격에 좀 더 랜덤한 시간을 주어 다시 시도해보세요.
  3. 다른 로그인 전략: 예를 들어, 모바일 네트워크 IP로 시도하거나 브라우저를 실제 사용자처럼 보이게 만드는 방법을 사용할 수 있습니다.

명시적 대기

명시적 대기를 언제나 사용해야 하는 것은 아닙니다. 그러나, 페이지의 로드나 요소의 로딩 상태가 일정하지 않을 때 명시적 대기를 사용하면 안정성을 크게 높일 수 있습니다. 현재 문제는 요소가 완전히 로드되지 않기 전에 액션을 수행하려고 해서 발생할 수 있습니다. 명시적 대기를 사용하는 것은 좋은 접근이며, 특히 웹 페이지 상의 특정 요소가 로드되기 전에 발생할 수 있는 오류를 방지합니다.

다음과 같은 점들을 고려하세요:

  • 명시적 대기 사용: 중요한 액션(버튼 클릭 등)을 수행하기 전에는 요소가 로드되었는지, 클릭 가능한 상태인지 명시적 대기를 통해 확인합니다.
  • 네트워크 상태: 인터넷 속도에 따라 명시적 대기의 시간이 충분하지 않을 수 있습니다. 상황에 따라 최대 대기 시간을 늘려보세요.
  • 적절한 대기 방법 선택: presence_of_element_located는 요소가 페이지에 존재하기만 하면 통과합니다. 액션(클릭 등)을 바로 수행할 필요가 있다면 element_to_be_clickable 같은 조건을 사용하셔야 합니다.

유사 질문과 답변

관련된 기존 질문이 있으니 참고하시면 도움이 될 것 같습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

wjddudtn1618님의 프로필 이미지
wjddudtn1618

작성한 질문수

질문하기