亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

請大家移步 FB:

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

0x01 前言

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

0x02 Selenium + PhantomJS

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

Selenium + PhantomJS(Firefox Chrome之類的)

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

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

 

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

0x03 execjs

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

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

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

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

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

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

0x04 Ghost

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

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

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

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

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

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


 

0x05 原理總結(jié)

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

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

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

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

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

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

相關(guān)文章

最新評論