淺談網絡爬蟲爬js動態加載網頁(三)


  上一篇討論了web driver對動態網頁的抓取與分析,可以很清楚的看出這是一種集中式處理方式,簡單說,就是利用服務器,打開一個真正的brower,然后將需要解析的地址交給瀏覽器,瀏覽器去解析,然后將結果返回。這樣正如網友評論一樣,效率上不好,其實我想說的是,如果質提不上去,可以采用量的方式,比如開多線程處理,多開幾台機器處理,雖然單個不快,量多后,處理速度就上去了。當然這也不是什么特別好的方法。

  先談談他的不好之處:

  首先,依賴瀏覽器的驅動,無論使用ie,firefox,chrome,都需要啟動其driver,才能進行操作。

  其次,對響應結果控制力度不夠自由,比如有些網頁我需要一個東西,有些網頁我需要另一個東西,那么我希望是,可以對響應結果進行解析和過濾。

  最后,他是一個集中式處理的方式,現在啥都講求分布式,當然不能為了分布而分布,不過在利用brower的資源時,分布是一個好的解決方法。

 

  那么,我還能做什么了,今天和同事聊的時候突然想到一個方案,也許會有一些幫助。當然,目前只是一個想法,不過后續我會去試驗可行性,我相信估計也有人這么試過。讓我們重新回歸原點,從上一篇的解決方案中可以看出,其實我們采用的基本是一種類似黑盒的測試方式,也就是說,我們根本沒有分析這些動態網頁的構成,只是單純的將網頁讓瀏覽器去解析,然后我們取得結果,(當然這里先不考慮一些復雜的ajax請求)。這里有兩個要素,一就是瀏覽器,使用的web driver;二就是瀏覽器去解析,並做了請求和響應。

  為什么我不能采用分布式處理呢?利用客戶端的資源來解析動態網頁,這樣不就減輕了壓力,而且可以大大增加處理地址的能力。我的想法是這樣的:

  1、開發一個簡單的網頁,用來訪問。例如一個jsp

  2、將需要進行解析的地址通過參數的形式傳給這個頁面。例如采用xxx.jsp?url='www.sina.com.cn'

  3、后台截獲這個req,然后根據新的url也就是"http://www.sina.com.cn",發起一個新的httprequest,將這個response,write給前面這個res.

  這樣其實就是將sina的respose,交給了我這個jsp。

  4、這樣,我就可以做一些手腳,例如獲取response的時候,采用html解析器,並利用規則過濾掉一些元素或者添加一些我們需要的腳本代碼,並將這個修改后的response,交個瀏覽器去執行。最后獲取執行后的結果,再交給服務器處理或者保存。

  這樣就避免掉一開始的一些問題。首先,與瀏覽器driver無關,也就是說如果用ie訪問,就利用ie引擎;用firefox訪問,就利用firefox引擎。就可以脫離web driver。其次,可以對結果進行自由控制,采用html解析器,就可以按照自己的規則來過濾響應。最后,利用這種方式就是一種分布式的處理,也就是說凡是訪問我頁面的瀏覽器,都可以用來進行頁面解析,而且可以不占用我服務器的帶寬。

  可見的問題在於:

  1、如何控制客戶端去訪問我想要的網址。

  2、如何將訪問后的內容傳回后台處理。

  3、由於篡改了響應,帶來的Cross Domain的問題會不會影響到我的解析結果。

  4、如何知道頁面已經加載完畢。

  5、采用何種解析器解析。

  

  由於這兩天公司正在搬家,暫時要緩緩,不過上面的問題我已經有了一個初步的解決辦法,不過仍需驗證。無論結果如何,過幾天再聊。呵呵


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM