使用Selenium進行動態(tài)爬蟲


人生苦短,我用python

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


console.log("Hello world");

這樣就會輸入Hello world了。

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

因為我的phantomJs.exe在E:\phantomjs-2.1.1-windows\bin里,我就將該位置添加進系統(tǒng)變量的Path里

系統(tǒng)變量配置

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


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



最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容