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는 브라우저 종류에 따라 브라우저 제작 업체에서 제공
크롬드라이버 설치
크롬 버전 확인
- 메뉴 - 도움말 - 크롬정보
- 공식site : https://www.selenium.dev/documentation/webdriver/getting_started/upgrade_to_selenium_4/
관련 메서드
- 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
'프로그래밍 > Crawling' 카테고리의 다른 글
[Crawling] https 403에러 발생 해결방법 (0) | 2022.08.17 |
---|---|
[Selenium] 버튼 클릭해서 나오는 값 동적 크롤링 하는 방법 (0) | 2022.08.16 |
[Python] Connection aborted에러 : Header추가하기 (크롤링) (0) | 2022.08.03 |
[WebCrawling] 네이버 뉴스 섹션별 토픽 기사 크롤링 2022.ver (0) | 2022.08.03 |
[WebCrawling] 네이버 뉴스 섹션 토픽 크롤링 2022.ver (0) | 2022.08.03 |