
最近看了才大(靜覓博客博主)的selenium教程,在使用過程中也遇到了不少問題,現(xiàn)在應該也算是入了點自動化測試的門道了。
Selenium 是什么?一句話,自動化測試工具。它支持各種瀏覽器,包括 Chrome,Safari,F(xiàn)irefox 等主流界面式瀏覽器,如果你在這些瀏覽器里面安裝一個 Selenium 的插件,那么便可以方便地實現(xiàn)Web界面的測試。換句話說叫 Selenium 支持這些瀏覽器驅動。
由于目前前端框架的興起,很多網(wǎng)站的頁面是由javascript生成的,靜態(tài)頁面的爬蟲就顯得比較無力。這時候就需要拿出selenium這般神器了,他可以模擬瀏覽器的操作,例如表單操作,點擊事件等等。
所以,我們可以通過selenium來爬取一些復雜的網(wǎng)站的信息。譬如淘寶,京東一類的通過框架渲染出來的頁面。
那就廢話不多說。我們用python結合selenium進行動態(tài)爬蟲的世界。
首先當然是安裝Selenium庫,使用pip安裝:
pip install selenium
先別急,使用selenium沒有瀏覽器驅動器模擬怎么行,所以推薦使用火狐(FireFox)或者PhantomJs,這里就要問了,什么是PhantamJs呢.
PhantomJS是一個無界面的,可腳本編程的WebKit瀏覽器引擎。它原生支持多種web 標準:DOM 操作,CSS選擇器,JSON,Canvas 以及SVG。
顯然,它和火狐也一樣是瀏覽器,只不過不能直接看到,可以間接的用截圖來看。
不過還是推薦使用火狐,因為火狐是比較直觀地能看到它的動作的。(為什么不用Chrome呢,因為我找了很多解決方案都沒有用,感覺應該是selenium和chrome的驅動器版本不匹配吧 -_-)
當然,這里兩者都會提供一下windows的安裝方式
這兩個東西,由于我的無知,掉了很多坑!終于弄明白安裝方式了!
1、PhantomJs,下載地址:
https://npm.taobao.org/dist/phantomjs/
找到對應的版本就好,比如我下載的是phantomjs-2.1.1-windows.zip
解壓到任意盤(我是解壓到E盤),然后找到bin里的phantomJs.exe。
在這里就可以寫javascript腳本了,例如

這樣就會輸入Hello world了。
但怎么才能在selenium中使用phantomJs呢。Windows用戶需要配置環(huán)境變量。
因為我的phantomJs.exe在E:\phantomjs-2.1.1-windows\bin里,我就將該位置添加進系統(tǒng)變量的Path里

這個時候phantomJs就配置好了。
進入cmd控制臺,輸入
phantomJs -v
便可以查詢版本,若配置完全,就可以顯示版本,我這里顯示的就是2.1.1。否則,檢查環(huán)境變量是否配置正確。
2、火狐(Firefox),下載地址
https://github.com/mozilla/geckodriver/releases
選擇合適的版本下載,例如我的是geckodriver-v0.18.0-win64
安裝分四步
1、首先得要有個FireFox瀏覽器,然后把FireFox的安裝位置添加到環(huán)境變量中,如果不太清楚這步,可以參考phantomjs的過程。
2、然后把剛剛下載的壓縮包中的geckodriver.exe 放到 FireFox的安裝目錄下。
3、最后最好再把geckodriver.exe 放到 python的安裝目錄下
4、OK,為自己鼓鼓掌,配置成功!?
配置完所有環(huán)境后,就是 進入正題了,動態(tài)爬蟲!
這里以FireFox驅動為例,進行selenium的示范
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("https://sg.search.yahoo.com/")
driver的類型為FireFox,也就是用火狐進行模擬。
driver.get("https://sg.search.yahoo.com/")? 這一句是請求雅虎,運行會發(fā)現(xiàn),自動打開了雅虎搜索網(wǎng)頁!(我也不知道為啥百度打不開了??!只能拿雅虎試水 ?:|)
下一步,進行模擬輸入,怎么辦呢,很簡單,找到輸入的標簽
那么用瀏覽器打開雅虎(此處用的FireFox),右鍵輸入框-查看元素
可以得知輸入框的id為yschsp? , 搜索按鈕的class為sbb。那就可以寫代碼了!
from selenium importwebdriver
driver=webdriver.Firefox()
driver.get("https://sg.search.yahoo.com/")
searchWhat=driver.find_element_by_id("yschsp")
#獲取id叫做'yschsp'的元素
searchWhat.clear()
#通過clear方法,可以將輸入框內的字符清空,比較保險的做法
searchWhat.send_keys("python")
#通過send_keys方法把'python'傳遞給serchWhat元素,即id叫做'yschsp'的元素
searchBtn=driver.find_element_by_class_name("sbb")
#獲取id叫做'sbb'的元素,但通常不推薦用class找,用selector能更精確的找到
searchBtn.click()
#通過click()方法點擊
運行后,可以看見瀏覽器自動輸入python后,又點擊了按鈕進行了搜索!
哈哈哈哈!這就是selenium的強大之處,這樣對于很多動態(tài)頁面也能很方便地爬取了!
然而這個selenium可沒那么簡單,它的慢是出了名的,很多坑需要用一些手段來處理。我總結一下目前遇到的一些問題。
一、最容易遇到的問題就是 編譯器報錯:
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element:
這是為什么呢,因為瀏覽器驅動器看不到你要找的元素!對!看不到!
最可能的情況就是網(wǎng)速慢導致還沒加載出來,那我們就等他加載出來
import time
time.sleep(1)
強制等待到加載出來。
當然還有其他更加靈活的方法,可以查api來學習。(其實是筆者還不太會,不敢亂講(逃))
第二種可能是沒有通過一些交互的方式加載出來,比如要按個按鈕啊之類的,這就需要
自己仔細地去查找了。
第三種是有些網(wǎng)站需要滾動才會加載新的東西,比如qq空間,這時候要用js來強制滾動
js="document.documentElement.scrollTop=10000" #拖動滾動條到屏幕底端
driver.execute_script(js)
這樣就可以滾動后再加載出新的元素
二、還有些比較坑的情況,就是你找到的按鈕可能用click點擊根本沒用,并不是找錯了,而可能是這個網(wǎng)頁的框架引起的,還需要點擊父元素,同樣的也是要找到父元素后使用click方法。超坑的有木有! (微笑臉)
哈,終于寫完了~寫完日記寫代碼~