很多網(wǎng)站的數(shù)據(jù),比如電商網(wǎng)站商品的價(jià)格,評(píng)論等等會(huì)采用動(dòng)態(tài)加載的方式來(lái)加載,這樣可能在爬蟲(chóng)程序剛剛訪問(wèn)時(shí)無(wú)法直接獲取到相關(guān)數(shù)據(jù)。那么怎么應(yīng)對(duì)這樣的問(wèn)題呢?
先看下面一個(gè)例子:
這是京東上看一本書(shū)的場(chǎng)景。我們發(fā)現(xiàn)打開(kāi)一本書(shū)之后,書(shū)的價(jià)格,排名等信息及書(shū)的評(píng)論信息不是在我們第一次打開(kāi)網(wǎng)站時(shí)就立即加載進(jìn)來(lái)的。而是通過(guò)二次請(qǐng)求或多次的異步請(qǐng)求獲取的。這樣的頁(yè)面就是動(dòng)態(tài)頁(yè)面。
關(guān)于動(dòng)態(tài)頁(yè)面使用的場(chǎng)景:
希望異步刷新的場(chǎng)景。有些網(wǎng)頁(yè)內(nèi)容很多,一次加載完對(duì)服務(wù)器壓力很大,而且有的用戶不會(huì)去查看所有內(nèi)容;
GET把參數(shù)數(shù)據(jù)隊(duì)列添加到URL中,Key和Value的各個(gè)字段一一對(duì)應(yīng);在URL中可以看到。
瀏覽器的URL中有些符號(hào),字符不能被很好的識(shí)別。那么我們需要有一套編碼的方式來(lái)傳遞信息。所以發(fā)送端需要做urlencode; 接收端需要做urldecode;
https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1&tn=baidu&wd=python%20%E7%88%AC%E8%99%AB&oq=python%2520%25E7%2588%25AC%25E8%2599%25AB&rsv_pq=ef9e51560000eca9&rsv_t=db33UmQaiVre2ourDQMjsxtS03DJVCOUAc2AHonGCIhHT2or8zim%2F96kVGA&rqlang=cn&rsv_enter=0&prefixsug=python%2520%25E7%2588%25AC%25E8%2599%25AB&rsp=0&rsv_sug=2
在線測(cè)試工具: http://tool.chinaz.com/tools/urlencode.aspx
1.https://www.baidu.com/s?wd=DNS
?xxx=yyy&time=zzz get 請(qǐng)求的標(biāo)識(shí)
2.http://acb.com/login?name=zhangsan&password=123
login: name=zhangsan password=123
通過(guò)一個(gè)例子來(lái)看POST方法的使用:
這是有道翻譯的頁(yè)面,仔細(xì)觀察會(huì)發(fā)現(xiàn),當(dāng)用戶每次輸入一個(gè)想要翻譯的詞語(yǔ)時(shí),頁(yè)面的URL信息并不發(fā)生任何改變。這是一個(gè)典型的異步使用Ajax的技術(shù),用JSON格式進(jìn)行數(shù)據(jù)的傳遞。我們有時(shí)會(huì)遇到像淘寶這樣的大型網(wǎng)站,對(duì)數(shù)據(jù)版權(quán)看得特別重的,它們的網(wǎng)站有大量的工程師和技術(shù)人員去維護(hù),它們也可能在技術(shù)手段上采用多次交互數(shù)據(jù)包的方式來(lái)完成網(wǎng)站服務(wù)器與用戶瀏覽器之間的交互。如果此時(shí)還采用傳統(tǒng)的分析數(shù)據(jù)包的方式會(huì)比較的復(fù)雜,難度較高。那么,有沒(méi)有一勞永逸的方法,來(lái)解決此類問(wèn)題呢?
我們的解決方案是:Selenium + PhantomJS。
我們的爬蟲(chóng)其實(shí)就是在做模擬瀏覽器的行為。
一個(gè)Web自動(dòng)化測(cè)試工具,最初是為了網(wǎng)站自動(dòng)化測(cè)試而開(kāi)發(fā)的;我們玩游戲有按鍵精靈;Selenium也可以做類似的事情,但是它是在瀏覽器中做這樣的事情。
安裝: sudo pip install selenium(pip install selenium)
在Python中 from selenium import webdriver 來(lái)測(cè)試是否裝好
說(shuō)明:想要用Python做自動(dòng)化測(cè)試的童鞋們可以好好研究一下Selenium的使用。
說(shuō)明:我們上課用的時(shí)有界面的Firefox瀏覽器,以便于教學(xué);
一個(gè)基于webkit無(wú)界面(headless)的瀏覽器,它可以把網(wǎng)站加載到內(nèi)存中并執(zhí)行頁(yè)面上的JS,但它沒(méi)有圖形用戶界面,所以耗費(fèi)的資源比較少;
安裝: sudo apt install phantomjs (此方法可能安裝不完整,導(dǎo)致部分功能無(wú)法使用)
Linux Ubuntu下完全安裝的方法(參看http://blog.csdn.net/m0_38124502/article/details/79276499
)
Wget
https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
cd 下載
tar -xvf phantomjs-2.1.1-linux-x86_64.tar.bz2
cd phantomjs-2.1.1-linux-x86_64/
cd bin/
sudo cp phantomjs /usr/bin
python -啟動(dòng)-> 瀏覽器進(jìn)程phantomjs,
測(cè)試:
SpiderCodes\Phantomjs\.. 對(duì)其中的例子helloworld.js, pageload.js
進(jìn)行測(cè)試;
注意: ****有可能造成資源泄漏;為了避免這種事的發(fā)生,需要有個(gè)策略適當(dāng)?shù)臅r(shí)候去kill phantomjs進(jìn)程。
總的來(lái)說(shuō),我們的爬蟲(chóng)要盡量模擬的看起來(lái)就像是真正的用戶在瀏覽器上訪問(wèn)服務(wù)器網(wǎng)站的行為。如果我們使用GET或POST的方式來(lái)模擬瀏覽器與服務(wù)器間通信的行為,成本比較低,但是應(yīng)對(duì)復(fù)雜的網(wǎng)站或者服務(wù)器精心防御的網(wǎng)站來(lái)說(shuō)是很難騙過(guò)服務(wù)器的。Selenim+PhantomJS的方案則會(huì)讓我們的程序看起來(lái)更像是普通的用戶,但是它的效率相對(duì)而言會(huì)降低很多,速度也會(huì)慢很多。在大規(guī)模爬去數(shù)據(jù)時(shí)可能遇到許多新的挑戰(zhàn)。(比如網(wǎng)站尺寸的設(shè)置,等待時(shí)間的設(shè)定等)
聯(lián)系客服