工具:python/java + selenium + firefox/chrome/phantomjsjavascript
默認已經安裝好了firefox
php
pip是一個python的軟件包管理工具,用於自動下載並安裝、更新python 包,python3以後的某些版本已經自帶pip,在python 2.7以前的話,須要本身安裝,如今的安裝方法已經很是簡單,直接查看官方doc:http://pip.readthedocs.org/en /stable/installing/,下載get-pip.py並執行python get-pip.py便可一鍵安裝。其餘方法可參考《怎麼在windows下安裝pip》。爲了便於使用,最好添加到系統變量PATH中。
css
從官網下載windows版本的壓縮包(http://phantomjs.org/download.html)。下載以後,直接解壓到本地。建議使用最新版phantomjs-2.0.0-windows.zip,由於有些狀況下phantomjs不能正確的解析僅僅是由於版本兼容性很差,這種bug基本無解,繞來繞去最終換過版本就行了。html
若是是python環境,安裝好pip以後,直接使用java
若是是java環境,下載一個完整的selenium-server-standalone-2.48.2.jar包便可,這個包很大,已經包含了全部依賴包和各類driver如(htmlunit driver之類的)
python
版權問題,debian自帶的瀏覽器並非firefox。若是想在debian環境下,使用firefoxDriver進行模擬點擊,就必須先安裝firefox。我在debian服務器上試了幾種方法均失敗,不過下面仍是說一下找到的幾種方法。linux
方法一:從firefox官網下載linux版以後,直接解壓firefoxgit
方法二:命令行安裝。github
參考
web
1.
具體可參考phantomjs的官網:http://phantomjs.org/build.html
跟windows同樣簡單,直接pip install selenium就搞定,前提是pip可用。
selenium是一個自動化測試工具,支持多種編程語言java/python /javascript/ruby/php/C#/perl。咱們在爬蟲中主要用於抓取動態頁面時模擬瀏覽器行爲,繞事後臺執行js的複雜過程,用「所見 即所得」的方式進行頁面點擊、截屏、懸浮窗拖拽等。以前中文資料比較少,加上selenium 2.0和1.0巨大的區別,csdn上的中文博客大多很差使。剛搜了一下,好像有些中文社區和更正式一點的博客,感受不錯,先貼出來:
1. 《webDriver中文教程 & 中文社區》貌似是今年的,比較官方的樣子,還沒細看
3. 官網的webdriver使用文檔,也屬於入門級別,有些複雜操做須要從其餘有經驗的使用者的博客裏邊略窺一二。
4.《The Selenium Browser Automation Project》介紹比較全面。
下面主要介紹一下可能遇到的坑,別人的經驗能夠參考《記錄我遇到的使用selenium讓人摸不着頭腦的問題 》,下面是我碰過幾回的
Selenium2(webdriver)在使用get(url)方法打開一個網頁的時候,是不會繼續加載裏面的iframe中的頁面源碼,這與selenium 1的使用不一樣。當碰到有些元素不可選的時候,可使用開發者工具查看是否有iframe元素。
官網已經有使用webdriver的優缺點的比較,例如firefox一般比ie快,而無界面的HtmlUnitDriver一般會比firefox快,但對js的支持並非那麼好。而且不一樣driver對xpath語法的支持也不同。
就我的使用經驗來看,即使是一樣的webdriver差異仍是有點大的。例如在某些firefox的版本是能夠抓取數據的,但在另一些版本就不 行,selenium在這兩年的演化過程當中,中途出現過對最新firefox各類報錯、但對老版本firefox就正常,以及對老phantomjs不能 抓取,最新版本phantomjs就OK的狀況。當遇到各類很詭異的關於瀏覽器不能抓取問題的時候,須要考慮嘗試不一樣的webdriver,以避開 selenium對個別型號的瀏覽器支持不良的狀況。
當網頁上有ajax等動態元素時,webdriver.get(url)只會等待html和js文件加載完成,但不必定會等待js生成的元素都出如今頁面 源碼中。使用xpath或者css選擇器的時候,若是js產生的代碼沒有加載完成,就會報錯,這種咱們用開發者工具能發現的元素,但webdriver找 不到的狀況,一般都是由於等待時間不夠形成的。一般有兩種方法:
第一種隱式等待,優勢是想法簡單,缺點是不一樣的頁面須要的加載時間不一樣,爲了保證數據正確,須要取一個最大的等待時間,拖慢代碼執行效率。python中的源碼以下
driver.implicitly_wait(10) 第二種是顯示等待。用於指定等待到頁面加載到某些爲真的可控條件,例如出現某個元素以後,就認爲須要的頁面內容已經加載完成了,python代碼以下:
wait = WebDriverWait(driver, 30)
wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID,'authFrame'))) 關於數據等待能夠參考:《如何等待頁面元素加載完成》java實現,同時舉了個須要頁面等待的栗子。
一切不上代碼的演示都是耍流氓。
若是想訪問別的數據頁面,能夠driver.get(url)和click方法逐步訪問、點擊。這個效率會比較低,selenium也可使用多線程操做,但selenium並不保證多線程的數據一致性,簡單的講對多線程的支持不是很好。