Python/2.7 information

selenium

qkqhxla1 2015. 8. 9. 20:27

selenium download : https://pypi.python.org/pypi/selenium


docs : https://selenium-python.readthedocs.org


크롬 드라이버 : https://sites.google.com/a/chromium.org/chromedriver/downloads


selenium이란게 있다. 예를 들어 어떤 사이트에서 어떤 동작을 자동화시키는 파이썬 스크립트를 짜려고 할 때에 난감한 경우가 있다. 예를들면 입력한 데이터가 암호화되서 전송되는 경우에는 암호화 시키는 알고리즘까지 찾아서 구현을 해야하기때문에 구현난이도가 올라간다.


그런데 이 selenium을 쓰면 내가 직접 입력하는것처럼 데이터가 들어간다. 그러므로 전송되면서 내가 입력한 데이터가 바뀐다고 해도 그걸 몰라도 된다. 이게 되게 편하다. 근데 역시 편한만큼 큰 단점이 있다. 백그라운드로 크롬을 실제 브라우저처럼 실행시키기 때문에 느리고, 메모리도 더 많이먹는다. 크롤링을 할때 왠만해서는 안쓰는쪽으로 해보는게 좋을것같다. (계속 써본결과 속도가 너무 느려서 쓸만한게 못됨. 진짜 이거아니면 절대로 안될거같은경우 아니면 쓰지말기)


아래는 docs에서 가져온 가벼운 예제이다. 아래 예제를 돌리려면 위의 크롬 드라이버 링크에서 exe파일을 받아서, 현재 파이썬 스크립트와 같은 디렉터리에 넣어줘야 한다.

# -*- encoding: cp949 -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
#driver.close()

중간의 find_element_by_name은 마치 js의 getElementByName() 처럼 동작하는것같다. 


어쨋든 예제는 한번 돌려보면 대충 이해할테고, 위에서 어떠한 데이터가 암호화되서 전송되는 경우 암호화 알고리즘을 찾아야하기때문에 난이도가 올라간다고 했는데, 이 경우중 하나가 프록시의 경우이다.


어떤 티스토리나, 네이버 블로그 등의 조회수를 올리기 위해서 프로그램을 짠다고 생각해보자. 여러 방법이 있겠지만 그중 하나가 프록시 사이트를 한 20개 모아놓은다음 해당 프록시에서 계속해서 하나씩 블로그로 요청을 보내면 알아서 조회수가 올라갈것이다. 


그런데 대부분의 프록시 사이트가 위에서 말한것처럼 데이터가 암호화되서 보내진다. 암호화되는 알고리즘이 숨겨진건 아닌데, 분석해본사람은 알겠는데 복잡하다. 이럴때 selenium을 쓰면 암호화가 중간에서 어떻게 되는지 신경안써도 된다.


http://hugrid.com/index.php 같은 프록시를 대상으로 위의 소스를 변형해서 해보면 중간 데이터는 신경을 안 써도 됨을 알 수 있다.


파이썬코리아에 물어봤는데 브라우저를 안띄우고 콘솔만으로도 작업 가능하다고 함.

PhantomJS로 열면 되는데 브라우저가 열리긴 열리는데 그냥 백그라운드로 돌아가는듯...


PhantomJS : http://phantomjs.org/download.html


http://blog.likewise.org/2013/04/webdriver-testing-with-python-and-ghostdriver/


PhantomJS로 이것저것 해봤는데 PhantomJS의 결과물 페이지 소스를 받아올수 있으면 좋을거같다.


---------------------------------------------------------------------------------------------------


ex) phantomjs로 https://crontab.guru/#3_0-3,7-23/3_*_*_* 의 영어로 써진 부분 가져오기.

# -*- coding: utf-8 -*-

from selenium import webdriver

browser = webdriver.PhantomJS('/Users/qkqhxla1/Downloads/phantomjs-2.1.1-macosx/bin/phantomjs')
browser.get('https://crontab.guru/#3_0-3,7-23/3_*_*_*')
print browser.find_element_by_css_selector('div[class="human-readable"]').text
browser.quit()