Python 爬蟲修養-處理動態網頁

來源:本網整理

思路一:分析Javascript代碼找到請求數據1.Chrome+F12開發者選項2.Firefox+Firebug思路二:利用瀏覽器內核或JS引擎執行Javascript代碼1.Selenium+PhantomJs2.PyQt/QtWebkit3.CasperJS4.PyExecJSwww.anxorj.tw防采集請勿采集本網。

s">

Python 爬蟲修養-處理動態網頁

作者:佚名 字體:[增加 減小] 來源:互聯網 時間:09-12 11:51:13 我要評論 在爬蟲開發中,大家可以很輕易地 bypass 所謂的 UA 限制,甚至用 scrapy 框架輕易實現按照深度進行爬行。但是實際上,這些并不夠。關于爬蟲的基礎知識比如數據處理與數據存儲多線程之類的 ">

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

最好的方法就是使用selenium這種庫哦。簡單介紹一下selenium,這本身是一種網站自動測試的庫,所以可以模擬用戶的所有交互行為,包括selenium最好配合PhantomJS使用,這樣就沒有界面,完全自動處理哦。

請大家移步 FB:

動態生成的頁面一般都是通過ajax發送請求,直接抓包獲得請求,用python發送請求,解析返回的json數據,獲得結果。

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

建議選擇方案一,畢竟能用js處理的后端數據基本上都不怎么復雜,即使復雜,前端代碼都是透明的,找一找源碼就好。方案二除非你是要獲取大量的不同的網站才考慮使用,效率低,不過網上貌似有現成

0x01 前言

\"限制只爬去指定網站\"很簡單:用正則表達式 基本都是 re模塊就OK了

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

Python爬蟲可以爬取的東西有很多,Python爬蟲怎么學?簡單的分析下: 如果你仔細觀察,就不難發現,懂爬蟲、學習爬蟲的人越來越多,一方面,互聯網可以獲取的數據越來越多,另一方面,像 Python

0x02 Selenium + PhantomJS

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

Selenium + PhantomJS(Firefox Chrome之類的)

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

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

 

當然說了這么多,Selenium 雖然不適合做生產解決方案,也并不是沒有別的解決辦法了。

0x03 execjs

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

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

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

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

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

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

0x04 Ghost

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

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

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

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

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

其實還是有他自己的缺點的,就是我們還是不能完全控制每一個過程,比如我們如果只想讓它解析 DOM 樹,不動態執行 js 腳本,而且,我想獲取他的 DOM 樹手動進行一些操作。這些都是沒有辦法的。但是也并不是完全沒有辦法,比如國內某廠他們就做了 HOOK 了一個瀏覽器去檢測 XSS 這個思路我們可以在以后的文章中提出,具體的操作的話,這就要看大家的編程功底了。

 

0x05 原理總結

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

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

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

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

本文轉自:i春秋社區

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

我們一直使用思路二中的方法1,也就是說用一個瀏覽器內容來運行JavaScript和解析動態內容,而用python模擬人在瀏覽器上做動作。這個實現方案最自然,雖然有人一直在批評這樣的速度比較慢,但是在實際運行環境中,大部分情況下你會擔心運行得太快了,我們采集這些網站的目的往往是為了BI項目或者數據分析,會集中且持續地從同一個目標網站上抓取數據,會給這個網站造成很大壓力,從而會被封鎖或者遇到驗證碼,所以,速度問題并不是關鍵問題。用一個瀏覽器內容去模擬人的動作,省去用Firebug甚至底層抓包工具去一點點分析每個ajax消息。要知道,現在越來越多的網站使用ajax技術,持續不斷的發送xmlhttprequest請求,要是挨個抓包分析,工作量太大了內容來自www.anxorj.tw請勿采集。

免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
Copyright © 2017 www.anxorj.tw All Rights Reserved
陕西快乐10分下载