欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python 爬蟲修養(yǎng)-處理動態(tài)網(wǎng)頁

  發(fā)布時間:2016-09-12 11:51:13   作者:佚名   我要評論
在爬蟲開發(fā)中,大家可以很輕易地 bypass 所謂的 UA 限制,甚至用 scrapy 框架輕易實現(xiàn)按照深度進(jìn)行爬行。但是實際上,這些并不夠。關(guān)于爬蟲的基礎(chǔ)知識比如數(shù)據(jù)處理與數(shù)據(jù)存儲多線程之類的

在爬蟲開發(fā)中,大家可以很輕易地 bypass 所謂的 UA 限制,甚至用 scrapy 框架輕易實現(xiàn)按照深度進(jìn)行爬行。但是實際上,這些并不夠。關(guān)于爬蟲的基礎(chǔ)知識比如數(shù)據(jù)處理與數(shù)據(jù)存儲多線程之類的。

請大家移步 FB:

該系列文章都是本人所寫,能力有限請多包涵。

0x01 前言

在進(jìn)行爬蟲開發(fā)的過程中,我們會遇到很多的棘手的問題,當(dāng)然對于普通的問題比如 UA 等修改的問題,我們并不在討論范圍,既然要將修養(yǎng),自然不能說這些完全沒有意思的小問題。

0x02 Selenium + PhantomJS

這個東西算是老生長談的問題吧,基本我在問身邊的朋友們的時候,他們都能講出這條解決方案:

Selenium + PhantomJS(Firefox Chrome之類的)

但是真正的有實踐過的人,是不會把這個東西投入生產(chǎn)環(huán)境的,首先最大的問題就是Selenium + PhantomJS 非常的慢,這種慢的原因就是因為他要加載這個網(wǎng)頁所有的內(nèi)容,比如圖片資源,link 中的 CSS,JS 都會加載,而且還會渲染整個網(wǎng)頁,在渲染結(jié)束之后才會允許你操作網(wǎng)頁的元素。當(dāng)然可能會有讀者問,Selenium 作為可以自動化編寫測試腳本的一個模塊,他是自帶 HOOK 功能的,在 Selenium 的 API 中也有介紹說 Selenium 可以控制等待某一個元素加載成功時返回頁面數(shù)據(jù)。

沒錯的確是這樣的,我們確實可以使用 Selenium 的內(nèi)置 api 去操作瀏覽器完成各種各樣的操作,比如模擬點擊,模擬填表,甚至執(zhí)行 js,但是最大的問題我們還是沒有解決:歸根結(jié)底是操作瀏覽器來進(jìn)行工作的,啟動需要打開瀏覽器(等待一定時間),訪問網(wǎng)頁之后渲染,下載相應(yīng)資源,執(zhí)行 JS,這么多的步驟,每一個步驟都需要或多或少的等待時間,這就好比,我們就是在使用瀏覽器做這樣的事情,只不過是加上了精準(zhǔn)的鼠標(biāo)定位而已。

 

當(dāng)然說了這么多,Selenium 雖然不適合做生產(chǎn)解決方案,也并不是沒有別的解決辦法了。

0x03 execjs

execjs 是一個在 Python 中執(zhí)行 js 的模塊,聽到這個,大家可能會覺得耳目一新:欸?那我是不是可以爬蟲爬下來 js 代碼然后手動控制 js 執(zhí)行,然后就可以控制自己想要的元素,拿到想要的結(jié)果,而且也并不丟失效率。

但是我要說這樣的想法,實際上是非常的 naive,雖然有了這個 js 引擎,但是,我們需要很多很多的輪子,為什么呢?來聽我一步一步解釋:

1. js 的強大之處其實并不在于松散的語法與容錯,而是在于對 BOM 對象和 DOM 對象的操作。舉個例子來說,比如,一個網(wǎng)頁的表單,是通過操作執(zhí)行 js 來提交的。 那么,問題就在于你有辦法僅僅用這個 execjs 來執(zhí)行這段 js 來提交表單么? 顯然,這是行不通的。為什么呢?因為對于我們來說的話 execjs 是一個獨立的模塊,我們沒有辦法把我們靜態(tài)扒下來的html 文檔和 execjs 建立聯(lián)系。

2. 如果非要建立聯(lián)系,那么你需要自己完成 js  html  DOM 對象的綁定,具體怎么完成呢?js 在瀏覽器中怎么與 DOM 樹綁定,你就需要怎么去做。但是要怎么做啊,首先你需要一個自己構(gòu)建 DOM 樹,然后才能進(jìn)行手動綁定。這個輪子,確實是非常的大。

但是如果你真的有大把的時間,那么應(yīng)該怎么去做這個事情呢?沒錯要不你去 HOOK 一個webkit 要不你去自己構(gòu)建一個 html 的解析器。那么我就在這里稍微提一下這個很有趣的事情:如果構(gòu)建一個 HTML 解析器:

最近有用 PLY 寫過一個 Lexer 當(dāng)時準(zhǔn)備做個解析 DOM 樹的 HTML 解析器,自己實踐第一步也是覺得這個東西理論上是完全可行的,但是能不能完成就要看個人毅力和你個人的編程能力了。

0x04 Ghost

關(guān)于 Ghost 的話,其實我個人是比較推崇的,但是其實他也并不是特別完美,它對我來說,更像是一個 Selenium 與PhantomJS 的結(jié)合體,怎么說呢,實際上 ghost 這個模塊用的是QT 中的 webkit,在安裝的時候就得被迫安裝 pyside 或者 pyqt4,實際上我當(dāng)時還是很難理解為什么一個這個東西沒有圖形界面要使用 qt 和 pyside 這種東西作為引擎呢?單獨構(gòu)造一個瀏覽器引擎真的就這么困難么?其實裝好了也沒什么關(guān)系,畢竟我覺得還是要比Selenium 配 PhantomJS 好用的。

話說回來,我們就來討論一下這個 Ghost 的一些問題。

首先,使用 Ghost 的一個好處是我們并不需要再將一個 binary 的瀏覽器放在路徑下了,以至于我們不需要去花費時間打開瀏覽器了,因為 ghost 就是一個功能完全的 Python 實現(xiàn)(借助 qt 的 webkit)的輕量級沒有圖形化的瀏覽器。

而且,ghost 在初始化的時候,有一個選項可以不下載圖片,但是沒有辦法阻止它下載 js 和css, 其實這個也是可以原諒的,畢竟自己在使用的時候,也是需要自己去下載 js 在本地篩選。

于此同時 ghost 還是提供了相應(yīng)的 API 這些 API 和 selenium 的 API 功能基本差別不是特別大,也會有處理表單,執(zhí)行 ajax 去加載動態(tài)頁面,這樣來說 ghost 是一個完美的解決方案么?

其實還是有他自己的缺點的,就是我們還是不能完全控制每一個過程,比如我們?nèi)绻幌胱屗馕?nbsp;DOM 樹,不動態(tài)執(zhí)行 js 腳本,而且,我想獲取他的 DOM 樹手動進(jìn)行一些操作。這些都是沒有辦法的。但是也并不是完全沒有辦法,比如國內(nèi)某廠他們就做了 HOOK 了一個瀏覽器去檢測 XSS 這個思路我們可以在以后的文章中提出,具體的操作的話,這就要看大家的編程功底了。


 

0x05 原理總結(jié)

當(dāng)然,懂得歸納的讀者其實早就已經(jīng)看出來了,對動態(tài)網(wǎng)頁(通過 js 加載)的網(wǎng)頁的信息采集,主要分成三種方案:

1. 基于實體瀏覽器操作解決方案(適用于測試環(huán)境不適用于大量信息采集)。

2. 基于深度控制 JS 腳本執(zhí)行的解決方案(速度最快,編寫難度最大)。

3. 基于 webkit 的解決方案。(相對較為折衷)

本文轉(zhuǎn)自:i春秋社區(qū)

原文地址:http://bbs.ichunqiu.com/thread-11098-1-1.html?from=jbzj

相關(guān)文章

最新評論