Python 爬蟲修養(yǎng)-處理動態(tài)網頁
在爬蟲開發(fā)中,大家可以很輕易地bypass所謂的UA限制,甚至用scrapy框架輕易實現(xiàn)按照深度進行爬行。但是實際上,這些并不夠。關于爬蟲的基礎知識比如數(shù)據(jù)處理與數(shù)據(jù)存儲多線程之類的。
請大家移步FB:
該系列文章都是本人所寫,能力有限請多包涵。
0x01
在進行爬蟲開發(fā)的過程中,我們會遇到很多的棘手的問題,當然對于普通的問題比如UA等修改的問題,我們并不在討論范圍,既然要將修養(yǎng),自然不能說這些完全沒有意思的小問題。
0x02Selenium+PhantomJS
這個東西算是老生長談的問題吧,基本我在問身邊的朋友們的時候,他們都能講出這條解決方案:
Selenium+PhantomJS(FirefoxChrome之類的)
但是真正的有實踐過的人,是不會把這個東西投入生產環(huán)境的,首先最大的問題就是Selenium+PhantomJS非常的慢,這種慢的原因就是因為他要加載這個網頁所有的內容,比如圖片資源,link中的CSS,JS都會加載,而且還會渲染整個網頁,在渲染結束之后才會允許你操作網頁的元素。當然可能會有讀者問,Selenium作為可以自動化編寫測試腳本的一個模塊,他是自帶HOOK功能的,在Selenium的API中也有介紹說Selenium可以控制等待某一個元素加載成功時返回頁面數(shù)據(jù)。
沒錯的確是這樣的,我們確實可以使用Selenium的內置api去操作瀏覽器完成各種各樣的操作,比如模擬點擊,模擬填表,甚至執(zhí)行js,但是最大的問題我們還是沒有解決:歸根結底是操作瀏覽器來進行工作的,啟動需要打開瀏覽器(等待一定時間),訪問網頁之后渲染,下載相應資源,執(zhí)行JS,這么多的步驟,每一個步驟都需要或多或少的等待時間,這就好比,我們就是在使用瀏覽器做這樣的事情,只不過是加上了精準的鼠標定位而已。

當然說了這么多,Selenium雖然不適合做生產解決方案,也并不是沒有別的解決辦法了。
0x03execjs
execjs是一個在Python中執(zhí)行js的模塊,聽到這個,大家可能會覺得耳目一新:欸?那我是不是可以爬蟲爬下來js代碼然后手動控制js執(zhí)行,然后就可以控制自己想要的元素,拿到想要的結果,而且也并不丟失效率。
但是我要說這樣的想法,實際上是非常的naive,雖然有了這個js引擎,但是,我們需要很多很多的輪子,為什么呢?來聽我一步一步解釋:
1.js的強大之處其實并不在于松散的語法與容錯,而是在于對BOM對象和DOM對象的操作。舉個例子來說,比如,一個網頁的表單,是通過操作執(zhí)行js來提交的。那么,問題就在于你有辦法僅僅用這個execjs來執(zhí)行這段js來提交表單么?顯然,這是行不通的。為什么呢?因為對于我們來說的話execjs是一個獨立的模塊,我們沒有辦法把我們靜態(tài)扒下來的html文檔和execjs建立聯(lián)系。
2.如果非要建立聯(lián)系,那么你需要自己完成js對html的DOM對象的綁定,具體怎么完成呢?js在瀏覽器中怎么與DOM樹綁定,你就需要怎么去做。但是要怎么做啊,首先你需要一個自己構建DOM樹,然后才能進行手動綁定。這個輪子,確實是非常的大。
但是如果你真的有大把的時間,那么應該怎么去做這個事情呢?沒錯要不你去HOOK一個webkit要不你去自己構建一個html的解析器。那么我就在這里稍微提一下這個很有趣的事情:如果構建一個HTML解析器:

最近有用PLY寫過一個Lexer當時準備做個解析DOM樹的HTML解析器,自己實踐第一步也是覺得這個東西理論上是完全可行的,但是能不能完成就要看個人毅力和你個人的編程能力了。
0x04Ghost
關于Ghost的話,其實我個人是比較推崇的,但是其實他也并不是特別完美,它對我來說,更像是一個Selenium與PhantomJS的結合體,怎么說呢,實際上ghost這個模塊用的是QT中的webkit,在安裝的時候就得被迫安裝pyside或者pyqt4,實際上我當時還是很難理解為什么一個這個東西沒有圖形界面要使用qt和pyside這種東西作為引擎呢?單獨構造一個瀏覽器引擎真的就這么困難么?其實裝好了也沒什么關系,畢竟我覺得還是要比Selenium配PhantomJS好用的。
話說回來,我們就來討論一下這個Ghost的一些問題。
首先,使用Ghost的一個好處是我們并不需要再將一個binary的瀏覽器放在路徑下了,以至于我們不需要去花費時間打開瀏覽器了,因為ghost就是一個功能完全的Python實現(xiàn)(借助qt的webkit)的輕量級沒有圖形化的瀏覽器。
而且,ghost在初始化的時候,有一個選項可以不下載圖片,但是沒有辦法阻止它下載js和css,其實這個也是可以原諒的,畢竟自己在使用的時候,也是需要自己去下載js在本地篩選。
于此同時ghost還是提供了相應的API這些API和selenium的API功能基本差別不是特別大,也會有處理表單,執(zhí)行ajax去加載動態(tài)頁面,這樣來說ghost是一個完美的解決方案么?
其實還是有他自己的缺點的,就是我們還是不能完全控制每一個過程,比如我們如果只想讓它解析DOM樹,不動態(tài)執(zhí)行js腳本,而且,我想獲取他的DOM樹手動進行一些操作。這些都是沒有辦法的。但是也并不是完全沒有辦法,比如國內某廠他們就做了HOOK了一個瀏覽器去檢測XSS這個思路我們可以在以后的文章中提出,具體的操作的話,這就要看大家的編程功底了。

0x05原理總結
當然,懂得歸納的讀者其實早就已經看出來了,對動態(tài)網頁(通過js加載)的網頁的信息采集,主要分成三種方案:
1.基于實體瀏覽器操作解決方案(適用于測試環(huán)境不適用于大量信息采集)。
2.基于深度控制JS腳本執(zhí)行的解決方案(速度最快,編寫難度最大)。
3.基于webkit的解決方案。(相對較為折衷)
本文轉自:i春秋社區(qū)
原文地址:http://bbs.ichunqiu.com/thread-11098-1-1.html?from=jbzj
版權聲明:本站文章來源標注為YINGSOO的內容版權均為本站所有,歡迎引用、轉載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網站,禁止在非maisonbaluchon.cn所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內容來源于網友推薦、互聯(lián)網收集整理而來,僅供學習參考,不代表本站立場,如有內容涉嫌侵權,請聯(lián)系alex-e#qq.com處理。
關注官方微信