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

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

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

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

請(qǐng)大家移步 FB:

該系列文章都是本人所寫(xiě),能力有限請(qǐng)多包涵。

0x01 前言

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

0x02 Selenium + PhantomJS

這個(gè)東西算是老生長(zhǎng)談的問(wèn)題吧,基本我在問(wèn)身邊的朋友們的時(shí)候,他們都能講出這條解決方案:

Selenium + PhantomJS(Firefox Chrome之類(lèi)的)

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

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

 

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

0x03 execjs

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

但是我要說(shuō)這樣的想法,實(shí)際上是非常的 naive,雖然有了這個(gè) js 引擎,但是,我們需要很多很多的輪子,為什么呢?來(lái)聽(tīng)我一步一步解釋?zhuān)?/p>

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

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

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

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

0x04 Ghost

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

話說(shuō)回來(lái),我們就來(lái)討論一下這個(gè) Ghost 的一些問(wèn)題。

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

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

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

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


 

0x05 原理總結(jié)

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

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

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

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

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

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

相關(guān)文章

最新評(píng)論