最近看了才大(靜覓博客博主)的selenium教程苍鲜,在使用過程中也遇到了不少問題,現(xiàn)在應(yīng)該也算是入了點(diǎn)自動(dòng)化測(cè)試的門道了玷犹。
Selenium 是什么混滔?一句話,自動(dòng)化測(cè)試工具歹颓。它支持各種瀏覽器坯屿,包括 Chrome,Safari巍扛,F(xiàn)irefox 等主流界面式瀏覽器领跛,如果你在這些瀏覽器里面安裝一個(gè) Selenium 的插件,那么便可以方便地實(shí)現(xiàn)Web界面的測(cè)試撤奸。換句話說叫 Selenium 支持這些瀏覽器驅(qū)動(dòng)吠昭。
由于目前前端框架的興起,很多網(wǎng)站的頁面是由javascript生成的胧瓜,靜態(tài)頁面的爬蟲就顯得比較無力矢棚。這時(shí)候就需要拿出selenium這般神器了,他可以模擬瀏覽器的操作贷痪,例如表單操作,點(diǎn)擊事件等等蹦误。
所以劫拢,我們可以通過selenium來爬取一些復(fù)雜的網(wǎng)站的信息。譬如淘寶强胰,京東一類的通過框架渲染出來的頁面舱沧。
那就廢話不多說。我們用python結(jié)合selenium進(jìn)行動(dòng)態(tài)爬蟲的世界偶洋。
首先當(dāng)然是安裝Selenium庫熟吏,使用pip安裝:
pip install selenium
先別急,使用selenium沒有瀏覽器驅(qū)動(dòng)器模擬怎么行,所以推薦使用火狐(FireFox)或者PhantomJs牵寺,這里就要問了悍引,什么是PhantamJs呢.
PhantomJS是一個(gè)無界面的,可腳本編程的WebKit瀏覽器引擎。它原生支持多種web 標(biāo)準(zhǔn):DOM 操作帽氓,CSS選擇器趣斤,JSON,Canvas 以及SVG黎休。
顯然浓领,它和火狐也一樣是瀏覽器,只不過不能直接看到势腮,可以間接的用截圖來看联贩。
不過還是推薦使用火狐,因?yàn)榛鸷潜容^直觀地能看到它的動(dòng)作的捎拯。(為什么不用Chrome呢泪幌,因?yàn)槲艺伊撕芏嘟鉀Q方案都沒有用,感覺應(yīng)該是selenium和chrome的驅(qū)動(dòng)器版本不匹配吧 -_-)
當(dāng)然玄渗,這里兩者都會(huì)提供一下windows的安裝方式
這兩個(gè)東西座菠,由于我的無知,掉了很多坑藤树!終于弄明白安裝方式了浴滴!
1、PhantomJs岁钓,下載地址:
https://npm.taobao.org/dist/phantomjs/
找到對(duì)應(yīng)的版本就好升略,比如我下載的是phantomjs-2.1.1-windows.zip
解壓到任意盤(我是解壓到E盤),然后找到bin里的phantomJs.exe屡限。
在這里就可以寫javascript腳本了品嚣,例如
這樣就會(huì)輸入Hello world了。
但怎么才能在selenium中使用phantomJs呢钧大。Windows用戶需要配置環(huán)境變量翰撑。
因?yàn)槲业膒hantomJs.exe在E:\phantomjs-2.1.1-windows\bin里,我就將該位置添加進(jìn)系統(tǒng)變量的Path里
這個(gè)時(shí)候phantomJs就配置好了啊央。
進(jìn)入cmd控制臺(tái)眶诈,輸入
phantomJs -v
便可以查詢版本,若配置完全瓜饥,就可以顯示版本逝撬,我這里顯示的就是2.1.1。否則乓土,檢查環(huán)境變量是否配置正確宪潮。
2溯警、火狐(Firefox),下載地址
https://github.com/mozilla/geckodriver/releases
選擇合適的版本下載,例如我的是geckodriver-v0.18.0-win64
安裝分四步
1狡相、首先得要有個(gè)FireFox瀏覽器梯轻,然后把FireFox的安裝位置添加到環(huán)境變量中,如果不太清楚這步谣光,可以參考phantomjs的過程檩淋。
2、然后把剛剛下載的壓縮包中的geckodriver.exe 放到 FireFox的安裝目錄下萄金。
3蟀悦、最后最好再把geckodriver.exe 放到 python的安裝目錄下
4、OK氧敢,為自己鼓鼓掌日戈,配置成功!?
配置完所有環(huán)境后孙乖,就是 進(jìn)入正題了浙炼,動(dòng)態(tài)爬蟲!
這里以FireFox驅(qū)動(dòng)為例唯袄,進(jìn)行selenium的示范
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("https://sg.search.yahoo.com/")
driver的類型為FireFox弯屈,也就是用火狐進(jìn)行模擬。
driver.get("https://sg.search.yahoo.com/")? 這一句是請(qǐng)求雅虎恋拷,運(yùn)行會(huì)發(fā)現(xiàn)资厉,自動(dòng)打開了雅虎搜索網(wǎng)頁!(我也不知道為啥百度打不開了J吖恕宴偿!只能拿雅虎試水 ?:|)
下一步,進(jìn)行模擬輸入诀豁,怎么辦呢窄刘,很簡(jiǎn)單,找到輸入的標(biāo)簽
那么用瀏覽器打開雅虎(此處用的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方法翻伺,可以將輸入框內(nèi)的字符清空,比較保險(xiǎn)的做法
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()方法點(diǎn)擊
運(yùn)行后遇汞,可以看見瀏覽器自動(dòng)輸入python后,又點(diǎn)擊了按鈕進(jìn)行了搜索!
哈哈哈哈空入!這就是selenium的強(qiáng)大之處络它,這樣對(duì)于很多動(dòng)態(tài)頁面也能很方便地爬取了!
然而這個(gè)selenium可沒那么簡(jiǎn)單歪赢,它的慢是出了名的化戳,很多坑需要用一些手段來處理。我總結(jié)一下目前遇到的一些問題埋凯。
一点楼、最容易遇到的問題就是 編譯器報(bào)錯(cuò):
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element:
這是為什么呢,因?yàn)闉g覽器驅(qū)動(dòng)器看不到你要找的元素白对!對(duì)掠廓!看不到!
最可能的情況就是網(wǎng)速慢導(dǎo)致還沒加載出來甩恼,那我們就等他加載出來
import time
time.sleep(1)
強(qiáng)制等待到加載出來蟀瞧。
當(dāng)然還有其他更加靈活的方法,可以查api來學(xué)習(xí)条摸。(其實(shí)是筆者還不太會(huì)悦污,不敢亂講(逃))
第二種可能是沒有通過一些交互的方式加載出來,比如要按個(gè)按鈕啊之類的钉蒲,這就需要
自己仔細(xì)地去查找了切端。
第三種是有些網(wǎng)站需要滾動(dòng)才會(huì)加載新的東西,比如qq空間子巾,這時(shí)候要用js來強(qiáng)制滾動(dòng)
js="document.documentElement.scrollTop=10000" #拖動(dòng)滾動(dòng)條到屏幕底端
driver.execute_script(js)
這樣就可以滾動(dòng)后再加載出新的元素
二帆赢、還有些比較坑的情況,就是你找到的按鈕可能用click點(diǎn)擊根本沒用线梗,并不是找錯(cuò)了椰于,而可能是這個(gè)網(wǎng)頁的框架引起的,還需要點(diǎn)擊父元素仪搔,同樣的也是要找到父元素后使用click方法瘾婿。超坑的有木有! (微笑臉)
哈烤咧,終于寫完了~寫完日記寫代碼~