• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 엔지니어링

  • 해결 여부

    미해결

[참고] 실전크롤링: xpath와 selenium 활용해서 페이스북 로그인하기

21.02.27 09:15 작성 조회수 363

0

강의 제목 - 실전크롤링: xpath와 selenium 활용해서 페이스북 로그인하기

 강의 동영상 6:46 에서

1. xpath 선택자 부분이 바뀌었습니다. 

기존코드

login_button = "//*[@id=''u_0_d]" 

바뀐코드

login_btn = "//*[@id='u_0_d_1n']" 

2. 기존 동영상 강의 코드 그대로 하면 크롤링이 안됩니다.

문제가 되는 부분  ------------

email_id = "//*[@id='email']"

password_id = "//*[@id='pass']"

login_button = "//*[@id='u_0_d_1n']"

email_tag = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH, email_id)))

password_tag = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH,password_id)))

login_button_tag = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH,login_button)))

xpath와  WebDriverWait 부분이 문제가 되는 것 같습니다.

 바꾼 전체 소스  코드 -------------

다음과 같이 바꾸니 크롤링이 되었습니다.

from selenium import webdriver

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.common.by import By

from selenium.webdriver.common.keys import Keys

import time

 

driver = webdriver.Chrome()

time.sleep(2)

driver.get('https://www.facebook.com')

time.sleep(5)

 

my_id = '7005425@gmail.com'

my_pwd = '칠공공5425'

email = driver.find_element_by_id('email')

password = driver.find_element_by_id('pass')

login_btn = driver.find_element_by_name('login') 

email.clear()

email.send_keys(my_id)

time.sleep(2)

password.clear()

password.send_keys(my_pwd)

time.sleep(2)

login_btn.click()

 

답변 1

답변을 작성해보세요.

0

알려주셔서 감사합니다. 올해내로 시간이 조금 된다면, 결국 외부 사이트는 다 싹 제 개인 사이트를 크롤링하는 것으로 만들어야할 것 같습니다. 워낙 수시로 바뀌어서요. 심지어 정부 Open API 도 바뀌다보니 ㅎㅎ

button 의 id 가 사실 매번 해당 사이트를 오픈할 때, 각자의 PC나 IP등등에 따라 달라지는 것 같습니다. 궁리 끝에, name 속성은 변경되지 않으므로 다음과 같이 변경하였고, 관련 영상의 자료도 다음과 같이 코드에 설명을 붙여놓았습니다.

# 2021.02.28 수정 : (수업자료에도 반영해놓았습니다.)

# 웹사이트 변경으로, 영상에서 시연한 "//*[@id='u_0_b']" 등으로는 id 가 매번 변경되어, 선택이 되지 않습니다.

# 따라서 변경되지 않은 button 의 name 속성을 사용해서 "//*[@name='login']"  으로 변경합니다.

login_button = "//*[@name='login']"

감사합니다.!!!