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

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