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

在爬蟲開發(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)文章
2019最新RDP遠(yuǎn)程桌面漏洞官方補(bǔ)丁(針對win2003、win2008)
Windows系列服務(wù)器于2019年5月15號,被爆出高危漏洞,windows2003、windows2008、windows2008 R2、windows xp系統(tǒng)都會遭到攻擊,該服務(wù)器漏洞利用方式是通過遠(yuǎn)程桌面端口332021-07-25寶塔面板 phpmyadmin 未授權(quán)訪問漏洞 BUG ip:888/pma的問題分析
這篇文章主要介紹了寶塔面板 phpmyadmin 未授權(quán)訪問漏洞 BUG ip:888/pma,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-24CPU幽靈和熔斷漏洞是什么?Intel為大家簡單易懂的科普了一番
不久前讓整全行業(yè)緊張、全球用戶恐慌的Spectre幽靈、Meltdown熔斷兩大漏洞事件剛剛告一段落了,那么這兩個(gè)漏洞到底是什么?可能還有很多人不是很清楚,想了解的朋友跟著小2018-03-21- 2017年5月12日,WannaCry蠕蟲通過MS17-010漏洞在全球范圍大爆發(fā),感染了大量的計(jì)算機(jī),該蠕蟲感染計(jì)算機(jī)后會向計(jì)算機(jī)中植入敲詐者病毒,導(dǎo)致電腦大量文件被加密,本文對其2017-05-17
- 大部分的用戶可能不要了解文件上傳漏洞,下面小編就為大家具體的講解什么事文件上傳漏洞以及文件上傳漏洞的幾種方式2016-11-02
- 漏洞檢測工具用語有高危漏洞,中危漏洞,低危漏洞以及漏洞的危害介紹,本文介紹的非常詳細(xì),具有參考解決價(jià)值,感興趣的朋友一起看看吧2016-10-11
- 漏洞無處不在,它是在硬件、軟件、協(xié)議的具體實(shí)現(xiàn)或系統(tǒng)安全策略上存在的缺陷,從而可以使攻擊者能夠在未授權(quán)的情況下訪問或破壞系統(tǒng)2016-09-29
手把手教你如何構(gòu)造Office漏洞POC(以CVE-2012-0158為例)
近年來APT追蹤盛行,最常見的就是各種以釣魚開始的攻擊,不僅僅有網(wǎng)站掛馬式釣魚,也有魚叉式郵件釣魚,下面小編就為大家介紹office漏洞CVE-2012-0158,一起來看看吧2016-09-28- SSL(安全套接字層)逐漸被大家所重視,但是最不能忽視的也是SSL得漏洞,隨著SSL技術(shù)的發(fā)展,新的漏洞也就出現(xiàn)了,下面小編就為大家介紹簡單七步教你如何解決關(guān)鍵SSL安全問題2016-09-23
Python 爬蟲修養(yǎng)-處理動態(tài)網(wǎng)頁
在爬蟲開發(fā)中,大家可以很輕易地 bypass 所謂的 UA 限制,甚至用 scrapy 框架輕易實(shí)現(xiàn)按照深度進(jìn)行爬行。但是實(shí)際上,這些并不夠。關(guān)于爬蟲的基礎(chǔ)知識比如數(shù)據(jù)處理與數(shù)據(jù)存2016-09-12