使用Selenium進(jìn)行動(dòng)態(tài)爬蟲


人生苦短,我用python

最近看了才大(靜覓博客博主)的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腳本了品嚣,例如


console.log("Hello world");

這樣就會(huì)輸入Hello world了。

但怎么才能在selenium中使用phantomJs呢钧大。Windows用戶需要配置環(huán)境變量翰撑。

因?yàn)槲业膒hantomJs.exe在E:\phantomjs-2.1.1-windows\bin里,我就將該位置添加進(jìn)系統(tǒng)變量的Path里

系統(tǒng)變量配置

這個(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方法瘾婿。超坑的有木有! (微笑臉)


哈烤咧,終于寫完了~寫完日記寫代碼~



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末偏陪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子煮嫌,更是在濱河造成了極大的恐慌笛谦,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昌阿,死亡現(xiàn)場(chǎng)離奇詭異饥脑,居然都是意外死亡恳邀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門灶轰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谣沸,“玉大人,你說我怎么就攤上這事笋颤∪楦剑” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵伴澄,是天一觀的道長(zhǎng)赋除。 經(jīng)常有香客問我,道長(zhǎng)非凌,這世上最難降的妖魔是什么贤重? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮清焕,結(jié)果婚禮上并蝗,老公的妹妹穿的比我還像新娘。我一直安慰自己秸妥,他們只是感情好滚停,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著粥惧,像睡著了一般键畴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上突雪,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天起惕,我揣著相機(jī)與錄音,去河邊找鬼咏删。 笑死惹想,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的督函。 我是一名探鬼主播嘀粱,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼辰狡!你這毒婦竟也來了锋叨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤宛篇,失蹤者是張志新(化名)和其女友劉穎娃磺,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叫倍,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡偷卧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年嘿般,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涯冠。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖逼庞,靈堂內(nèi)的尸體忽然破棺而出蛇更,到底是詐尸還是另有隱情,我是刑警寧澤赛糟,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布派任,位于F島的核電站,受9級(jí)特大地震影響璧南,放射性物質(zhì)發(fā)生泄漏掌逛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一司倚、第九天 我趴在偏房一處隱蔽的房頂上張望豆混。 院中可真熱鬧,春花似錦动知、人聲如沸皿伺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸵鸥。三九已至,卻和暖如春丹皱,著一層夾襖步出監(jiān)牢的瞬間妒穴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工摊崭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留讼油,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓呢簸,卻偏偏與公主長(zhǎng)得像汁讼,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子阔墩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容