Python. Selenium 으로 Crawling 하기

Selenium 으로 슈퍼 크롤러 되기.

Posted by MinJun on Tuesday, October 3, 2017 Tags: Python   3 minute read

준비물

  • Python3
  • Selenium
  • ChromeWebDriver(다른 브라우저에서 사용하고 싶다면, 해당 브라우져 드라이브를 사용하면 됩니다. 저는 chrome드라이브를 사용했습니다.)

how to install Python Reference: https://github.com/ulgoon


Selenium 사용 환경 구성 하기

  • Selenium 설치

터미널에서

pip install selenium

  • WebDriver

Selenium은 webdriver라는 것을 통해 디바이스에 설치된 브라우저를 제어할 수 있습니다. chromedriver 다운로드 링크 입니다.


실습

일단 쉬운것 부터 해봅니다, 네이버에 자동으로 로그인 할수 있게 만들어 봅니다! 저는 환경구성을 잘못한 탓인지, IDLE 에서는 import 가 되지 않았는데, jupyter notebook 에서는 잘 작동 하였습니다.

Selenium은 webdriver api를 통해서 브라우저를 제어 합니다. 우선 webdriver를 import를 해줍니다.

import os
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

# driver 를 설정합니다.
driver = webdriver.Chrome()

# api 가 처음 접근하는 url 을 설정합니다.
# 네이버 로그인 페이지로 접근합니다. 자세한 url은, 크롬 `command + option + i` 키를 누르면 개발자 모드로 변경되어서, 사용하고 싶은 부분의 HTML을 긁어올수 있습니다.
driver.get('https://nid.naver.com/nidlogin.login')

# url 접근후 3초간 기다려줍니다. 이유는 명령어에 접근하는 시간이랑, 실제로 코드가 적용되는 시간이 차이가 있어서, 컴퓨터가 더 빠르면(?) 다음 명령어가 씹히는 경우도 있습니다.
driver.implicitly_wait(3)

# 'naver_id' 에 naverID 를, 'password' 에 비밀번호를 입력하면, 자동으로 robot이 입력을 해준다. 

driver.find_element_by_name('id').send_keys('naver_id')
driver.find_element_by_name('pw').send_keys('password')

# 로그인 버튼을 클릭 해줍니다.

driver.find_element_by_xpath('//*[@id="frmNIDLogin"]/fieldset/input').click()
  • 네이버 접속 화면(위의 URL 을 한번 확인해 봅니다)

screen

위의 코드를 작성하고 실행 하면, 자동으로 로그인 하는것을 확인 할수 있습니다.


응용

  • 자동으로 검색 하기
import os
import time
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

driver = webdriver.Chrome()
driver.get("https://www.naver.co.kr/")
btn = 0

# 웹드라이브

# naver 에서 검색값 id = query
query = driver.find_element_by_id("query") 
 
# 검색창에 적어 줍니다.  
query.send_keys("MJ.Dev") 

# 검색하기 전 5초를 기다린다 
ff_driver.implicitly_wait(5)

# 초기 검색 버튼.
ff_driver.find_element_by_id("search_btn").click()

# 반복 검색 
while btn < 100 :
	  btn += 1
	  
	  # robot 의 움직임이 5초 멈춤
    ff_driver.implicitly_wait(5)
    
    # 코드의 흐름이 다음줄이 되면 10초가 멈춘후, 다음코드 실행
    time.sleep(10)
    
    # 새로운 검색창 검색값 id = bt_search
    ff_driver.find_element_by_class_name("bt_search").click()