1. 程式人生 > >使用Chrome快速實現數據的抓取(四)——優點

使用Chrome快速實現數據的抓取(四)——優點

一個 java 海量 height 調試工具 -1 idt socket程序 格式

些一個抓取WEB頁面的數據程序比較簡單,大多數語言都有相應的HTTP庫,一個簡單的請求響應即可,程序發送Http請求給Web服務器,服務器返回HTML文件。交互方式如下:

  技術分享

在使用DevProtocol驅動Chrome抓取數據時,交互過程則如下圖所示:

  技術分享

此時Chrome在中間充當了一個代理的角色,看上去變得更加復雜了,實際上卻對於我們的蜘蛛程序大有幫助。本文就簡單的總結下這種方式存在如下優點。

獲取動態生成的網頁內容

現在很多的網頁內容的內容並不是一開是就能直接通過最初的Http請求直接獲取到的,而是在返回的html頁面中通過JS加載資源及計算動態生成的頁面。采用這種方式的原因有很多,有的是為了更好的用戶體驗,有的是因為開發框架,有的是為了節省帶寬,也有的則單純是為了加密頁面內容,從而實現反爬蟲的功能。

不管是因為什麽原因,它使得本來很簡單的單一"請求-響應"式的交互過程變得復雜起來,傳統的一次交互即可完成所有的請求變成了如下形式:

  技術分享

動態加載給傳統的數據采集造成了不小的障礙,但往往需要分析頁面加載過程,分析JS,並在程序中嵌入js引擎,模擬瀏覽器執行相應的腳本,獲取最終的數據。這是一個非常費時費力的過程,並且不容易分析全。

為了更方便解析這種動態網頁,一些爬蟲引擎開始引入了Dom解析和JS執行能力,模擬瀏覽器來解析並獲取相關資源。但由於這一過程非常復雜,往往這些功能並不是非常完善,有不少的坑。

現在,通過Chrome的方式就是這種解析頁面的方式的集大成版本了,由於Chrome本身就是瀏覽器,具有完善的頁面解析能力,處理起來如魚得水。解析過程由chrome代理完成,我們只需要從chrome裏獲取最後解析完成的結果即可。

有效的應對反爬蟲策略

最簡單的反爬機制,就是檢查HTTP請求的Headers信息,包括User-Agent, Referer、Cookies等,根據手寫的Http請求報文頭和常用的瀏覽器報文頭的差異來反爬蟲。這些防止初級爬蟲非常有效,但Chrome本身就是一個標準瀏覽器,對於這類反爬機制天生免疫。

另外一種反爬機制是上文所說的動態加載,基於上面的解釋,這個對Chrome來說也是天生免疫的。

當然,反爬策略還有很多,如限制IP訪問次數,限制訪問頻率,驗證碼、等方式來反爬。這些雖然Chrome不直接支持,但應對起來也比傳統的Http請求方便得多的。後面文章中會陸續介紹,這裏就不一一展開了。

DOM操作能力

Chrome有完善的Dom操作能力,在Chrome DevTools控制臺中能執行的操作基本都可以在程序中通過DevProtocol完成,為我們的APP添加了完美的DOM操作能力, 很多以前需要分析HTML才能獲取的數據現在可以直接通過Jquery之類的js函數完成。並且可以直接格式化為JSON輸出,方便了不止一點半點。

和服務器交互更容易

很多時候,有的頁面是需要一些交互才能獲取到的,如登陸。

由於Chrome具有JS執行能力,我們可以通過一些簡單的JS腳本非常容易的執行。例如,園子的登陸就可以通過如下腳本實現:

$("#input1")[0].value = "userName";
$("#input2")[0].value = "password";
$("#signin")[0].click();

有的網站需要驗證碼來防止爬蟲程序,我們甚至可以通過在chrome中手動打碼的這種自動結合手動的方式快速實現數據抓取。如果要開發出支持接入打碼平臺或智能識別平臺的接口,也遠比傳統的蜘蛛程序容易的多。

另外,Chrome也提供了非常豐富的API模擬鍵盤和鼠標的輸入的接口,用起來非常方便。

開發調試方便

開發爬蟲程序往往是一個反復調試的過程,由於我們是直接解析Chrome獲取的數據,由於Chrome DevTool本身就是一個強大的調試工具。這樣大大加速了我們的開發過程。

我們可以通過首先在Chrome中通過DevTools查看解析我們的頁面,通過控制臺程序驗證編寫的腳本。用Chrome就可以完成大部分腳本的開發,而這一部分往往是不能復用,並且非常花時間的。這相當於我們獲取了一個強大的調試工具,可以節省不少時間。

另外,Chrome也是前端人員非常熟悉的工具,我們也可以把腳本開發的工作交給前端人員,他們可以更高效的開發腳本,大幅提高開發效率。

缺點

說了這麽多的優點,最後我們來說一說它的缺點,這種方式主要的缺點還是性能。

傳統的爬蟲是非常輕量級的,就是一個傳統的tcp的socket程序,通過異步socket的方式可以非常容易的實現成千上萬的並發數的,並且只加載了需要的信息,性能非常高。

而通過驅動chrome的方式是通過chrome獲取服務器端的數據的,一來加載了不必要的圖片,樣式,廣告等文件造成了帶寬的浪費,另外也對網頁進行了渲染造成了CPU的開銷,雖然可以通過插件減少不必要的文件加載和headless的方式減少開銷,但相對傳統的請求應答方式來說仍然是一個重量級的獲取方式。對於小規模的采集可能還問題不大,但如果要進行類似搜索引擎的方式的海量數據采集可能就有點吃不消了。

參考文章:

  • 普通反爬蟲機制的應對策略
  • 常見的反爬蟲和應對方法
  • Google 爬蟲如何抓取 JavaScript 的?

使用Chrome快速實現數據的抓取(四)——優點