프로그래밍/Crawling

[Selenium] 네이버 동적 로그인 하기 - 셀레니움 사용법

seojeon9 2022. 8. 16. 22:50

Selenium 패키지 모듈 이용한 동적 크롤링

셀레니움 설치

  •  selenium
    • webdriver라는 API를 통해 운영체제에 설치된 웹 브라우저를 제어하는 함수를 포함한 패키지
    • 써드파티 라이브러리이기 때문에 따로 설치 해줘야 함
pip install selenium

필요 패키지

# 패키지 임포트
import selenium
from selenium import webdriver
import pandas as pd
import numpy as np
from bs4 import BeautifulSoup
from selenium.webdriver.common.by import By
  • selenium은 브라우저를 컨트롤하는 기능이기 때문에 webdriver 프로그램을 사용
    • webdriver는 브라우저 종류에 따라 브라우저 제작 업체에서 제공

 

크롬드라이버 설치

 

크롬 버전 확인

 

관련 메서드

  • get(url) : url에 접근하는 메서드
  • 최신 셀레니움 버전에서 문법이 변경되었음
from selenium.webdriver.common.by import By

find_element(By.ID, "id")
find_element(By.NAME, "name")
find_element(By.XPATH, "xpath")
find_element(By.LINK_TEXT, "link text")
find_element(By.PARTIAL_LINK_TEXT, "partial link text")
find_element(By.TAG_NAME, "tag name")
find_element(By.CLASS_NAME, "class name")
find_element(By.CSS_SELECTOR, "css selector")
  • findElement() : 코드에서 조건에 맞는 태그 중 처음 나오는 태그(find)
  • findElements() : 코드에서 조건에 맞는 모든 태그(findAll)

  • Webdriver 객체 생성
    • driver = webdriver.Chrome(드라이버경로)
  • 접근한 페이지 source 추출
    • html=diver.page_source
  • driver 사용 연습
# 1. webdriver 객체 생성 
driver = webdriver.Chrome('./driver/chromedriver') # driver가 저장되어 있는 경로

# 페이지 접근
url = 'https://nid.naver.com/nidlogin.login'
driver.get(url)

# driver를 통해 화면 캡쳐
driver.save_screenshot('./crawl_data/sshot.png')

 

동적 로그인 예제 코드

# id 값 전달
# id 입력하는 input box 찾기
id_elem = driver.find_element(By.ID,'id')
type(id_elem)

# id 입력 input box 기존 값 지우기
id_elem.clear() # webelemnt 객체인 id_elem의 기존 data 삭제
# id 값 전달
id_elem.send_keys('아이디') # webelemnt 객체인 id_elem으로 data 전송

# 비밀번호 입력  input box 찾기
pw_elem = driver.find_element(By.ID,'pw')
pw_elem.clear()
pw_elem.send_keys('패스워드')

 

# 로그인 버튼 클릭
xpath = '//*[@id="log.login"]'
#로그인 버튼을 찾아서 클릭
driver.find_element(By.XPATH,xpath).click() # 셀레니움 클릭함수

# 자동입력 방지 문자가 나타남
# send_keys() 함수 사용 - 봇으로 인식

# => 파이썬 코드가 아니라 자바스크립트 코드를 보내야 봇으로 인식하지 않음

# 자동입력 방지 문자 우회하기위해 브라우저 종료 후 다시 접속
driver = webdriver.Chrome('./driver/chromedriver')
url ='https://nid.naver.com/nidlogin.login' 
driver.get(url)

 

# 자동입력 방지 문자 우회
# script 코드 작성
id_input = '아이디'
pw_input = '비밀번호'
# script 코드
"document.getElementsByName('id')[0].value=\'"+ id_input + "\'"
"document.getElementsByName('pw')[0].value=\'"+ pw_input + "\'"

 

webdriver 통해 script 코드 직접 실행

  • driver.execute_script() 함수 - driver로 script 코드를 직접 실행
driver.execute_script("document.getElementsByName('id')[0].value=\'"+id_input+"\'")

driver.execute_script("document.getElementsByName('pw')[0].value=\'"+ pw_input + "\'")

# 로그인 버튼 클릭
xpath = '//*[@id="log.login"]'
#로그인 버튼을 찾아서 클릭
driver.find_element(By.XPATH,xpath).click() # 셀레니움 클릭함수

# 메일 페이지로 접근
driver.get('https://mail.naver.com')

# 코드 추출
html = driver.page_source
soup = BeautifulSoup(html,'html.parser')
soup

# 드라이버 연결 끊기
driver.close()
728x90