使用Chrome快速实现数据的抓取(四)——优点
些一個(gè)抓取WEB頁(yè)面的數(shù)據(jù)程序比較簡(jiǎn)單,大多數(shù)語(yǔ)言都有相應(yīng)的HTTP庫(kù),一個(gè)簡(jiǎn)單的請(qǐng)求響應(yīng)即可,程序發(fā)送Http請(qǐng)求給Web服務(wù)器,服務(wù)器返回HTML文件。交互方式如下:?
在使用DevProtocol驅(qū)動(dòng)Chrome抓取數(shù)據(jù)時(shí),交互過(guò)程則如下圖所示:
此時(shí)Chrome在中間充當(dāng)了一個(gè)代理的角色,看上去變得更加復(fù)雜了,實(shí)際上卻對(duì)于我們的蜘蛛程序大有幫助。本文就簡(jiǎn)單的總結(jié)下這種方式存在如下優(yōu)點(diǎn)。
獲取動(dòng)態(tài)生成的網(wǎng)頁(yè)內(nèi)容
現(xiàn)在很多的網(wǎng)頁(yè)內(nèi)容的內(nèi)容并不是一開是就能直接通過(guò)最初的Http請(qǐng)求直接獲取到的,而是在返回的html頁(yè)面中通過(guò)JS加載資源及計(jì)算動(dòng)態(tài)生成的頁(yè)面。采用這種方式的原因有很多,有的是為了更好的用戶體驗(yàn),有的是因?yàn)殚_發(fā)框架,有的是為了節(jié)省帶寬,也有的則單純是為了加密頁(yè)面內(nèi)容,從而實(shí)現(xiàn)反爬蟲的功能。
不管是因?yàn)槭裁丛?#xff0c;它使得本來(lái)很簡(jiǎn)單的單一"請(qǐng)求-響應(yīng)"式的交互過(guò)程變得復(fù)雜起來(lái),傳統(tǒng)的一次交互即可完成所有的請(qǐng)求變成了如下形式:
動(dòng)態(tài)加載給傳統(tǒng)的數(shù)據(jù)采集造成了不小的障礙,但往往需要分析頁(yè)面加載過(guò)程,分析JS,并在程序中嵌入js引擎,模擬瀏覽器執(zhí)行相應(yīng)的腳本,獲取最終的數(shù)據(jù)。這是一個(gè)非常費(fèi)時(shí)費(fèi)力的過(guò)程,并且不容易分析全。
為了更方便解析這種動(dòng)態(tài)網(wǎng)頁(yè),一些爬蟲引擎開始引入了Dom解析和JS執(zhí)行能力,模擬瀏覽器來(lái)解析并獲取相關(guān)資源。但由于這一過(guò)程非常復(fù)雜,往往這些功能并不是非常完善,有不少的坑。
現(xiàn)在,通過(guò)Chrome的方式就是這種解析頁(yè)面的方式的集大成版本了,由于Chrome本身就是瀏覽器,具有完善的頁(yè)面解析能力,處理起來(lái)如魚得水。解析過(guò)程由chrome代理完成,我們只需要從chrome里獲取最后解析完成的結(jié)果即可。
有效的應(yīng)對(duì)反爬蟲策略
最簡(jiǎn)單的反爬機(jī)制,就是檢查HTTP請(qǐng)求的Headers信息,包括User-Agent, Referer、Cookies等,根據(jù)手寫的Http請(qǐng)求報(bào)文頭和常用的瀏覽器報(bào)文頭的差異來(lái)反爬蟲。這些防止初級(jí)爬蟲非常有效,但Chrome本身就是一個(gè)標(biāo)準(zhǔn)瀏覽器,對(duì)于這類反爬機(jī)制天生免疫。
另外一種反爬機(jī)制是上文所說(shuō)的動(dòng)態(tài)加載,基于上面的解釋,這個(gè)對(duì)Chrome來(lái)說(shuō)也是天生免疫的。
當(dāng)然,反爬策略還有很多,如限制IP訪問(wèn)次數(shù),限制訪問(wèn)頻率,驗(yàn)證碼、等方式來(lái)反爬。這些雖然Chrome不直接支持,但應(yīng)對(duì)起來(lái)也比傳統(tǒng)的Http請(qǐng)求方便得多的。后面文章中會(huì)陸續(xù)介紹,這里就不一一展開了。
DOM操作能力
Chrome有完善的Dom操作能力,在Chrome DevTools控制臺(tái)中能執(zhí)行的操作基本都可以在程序中通過(guò)DevProtocol完成,為我們的APP添加了完美的DOM操作能力, 很多以前需要分析HTML才能獲取的數(shù)據(jù)現(xiàn)在可以直接通過(guò)Jquery之類的js函數(shù)完成。并且可以直接格式化為JSON輸出,方便了不止一點(diǎn)半點(diǎn)。
和服務(wù)器交互更容易
很多時(shí)候,有的頁(yè)面是需要一些交互才能獲取到的,如登陸。
由于Chrome具有JS執(zhí)行能力,我們可以通過(guò)一些簡(jiǎn)單的JS腳本非常容易的執(zhí)行。例如,園子的登陸就可以通過(guò)如下腳本實(shí)現(xiàn):
????$("#input1")[0].value = "userName";
????$("#input2")[0].value = "password";
????$("#signin")[0].click();
有的網(wǎng)站需要驗(yàn)證碼來(lái)防止爬蟲程序,我們甚至可以通過(guò)在chrome中手動(dòng)打碼的這種自動(dòng)結(jié)合手動(dòng)的方式快速實(shí)現(xiàn)數(shù)據(jù)抓取。如果要開發(fā)出支持接入打碼平臺(tái)或智能識(shí)別平臺(tái)的接口,也遠(yuǎn)比傳統(tǒng)的蜘蛛程序容易的多。
另外,Chrome也提供了非常豐富的API模擬鍵盤和鼠標(biāo)的輸入的接口,用起來(lái)非常方便。????
開發(fā)調(diào)試方便
開發(fā)爬蟲程序往往是一個(gè)反復(fù)調(diào)試的過(guò)程,由于我們是直接解析Chrome獲取的數(shù)據(jù),由于Chrome DevTool本身就是一個(gè)強(qiáng)大的調(diào)試工具。這樣大大加速了我們的開發(fā)過(guò)程。
我們可以通過(guò)首先在Chrome中通過(guò)DevTools查看解析我們的頁(yè)面,通過(guò)控制臺(tái)程序驗(yàn)證編寫的腳本。用Chrome就可以完成大部分腳本的開發(fā),而這一部分往往是不能復(fù)用,并且非常花時(shí)間的。這相當(dāng)于我們獲取了一個(gè)強(qiáng)大的調(diào)試工具,可以節(jié)省不少時(shí)間。
另外,Chrome也是前端人員非常熟悉的工具,我們也可以把腳本開發(fā)的工作交給前端人員,他們可以更高效的開發(fā)腳本,大幅提高開發(fā)效率。
缺點(diǎn)
說(shuō)了這么多的優(yōu)點(diǎn),最后我們來(lái)說(shuō)一說(shuō)它的缺點(diǎn),這種方式主要的缺點(diǎn)還是性能。
傳統(tǒng)的爬蟲是非常輕量級(jí)的,就是一個(gè)傳統(tǒng)的tcp的socket程序,通過(guò)異步socket的方式可以非常容易的實(shí)現(xiàn)成千上萬(wàn)的并發(fā)數(shù)的,并且只加載了需要的信息,性能非常高。
而通過(guò)驅(qū)動(dòng)chrome的方式是通過(guò)chrome獲取服務(wù)器端的數(shù)據(jù)的,一來(lái)加載了不必要的圖片,樣式,廣告等文件造成了帶寬的浪費(fèi),另外也對(duì)網(wǎng)頁(yè)進(jìn)行了渲染造成了CPU的開銷,雖然可以通過(guò)插件減少不必要的文件加載和headless的方式減少開銷,但相對(duì)傳統(tǒng)的請(qǐng)求應(yīng)答方式來(lái)說(shuō)仍然是一個(gè)重量級(jí)的獲取方式。對(duì)于小規(guī)模的采集可能還問(wèn)題不大,但如果要進(jìn)行類似搜索引擎的方式的海量數(shù)據(jù)采集可能就有點(diǎn)吃不消了。
參考文章:
- 普通反爬蟲機(jī)制的應(yīng)對(duì)策略
- 常見的反爬蟲和應(yīng)對(duì)方法
- Google 爬蟲如何抓取 JavaScript 的?
轉(zhuǎn)載于:https://www.cnblogs.com/TianFang/p/7148043.html
總結(jié)
以上是生活随笔為你收集整理的使用Chrome快速实现数据的抓取(四)——优点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Arduino学习笔记07
- 下一篇: loback学习