上一篇討論了web driver對動態網頁的抓取與分析,能夠很清楚的看出這是一種集中式處理方式,簡單說,就是利用服務器,打開一個真正的brower,而後將須要解析的地址交給瀏覽器,瀏覽器去解析,而後將結果返回。這樣正如網友評論同樣,效率上很差,其實我想說的是,若是質提不上去,能夠採用量的方式,好比開多線程處理,多開幾臺機器處理,雖然單個不快,量多後,處理速度就上去了。固然這也不是什麼特別好的方法。html
先談談他的很差之處:web
首先,依賴瀏覽器的驅動,不管使用ie,firefox,chrome,都須要啓動其driver,才能進行操做。ajax
其次,對響應結果控制力度不夠自由,好比有些網頁我須要一個東西,有些網頁我須要另外一個東西,那麼我但願是,能夠對響應結果進行解析和過濾。chrome
最後,他是一個集中式處理的方式,如今啥都講求分佈式,固然不能爲了分佈而分佈,不過在利用brower的資源時,分佈是一個好的解決方法。瀏覽器
那麼,我還能作什麼了,今天和同事聊的時候忽然想到一個方案,也許會有一些幫助。固然,目前只是一個想法,不事後續我會去試驗可行性,我相信估計也有人這麼試過。讓咱們從新迴歸原點,從上一篇的解決方案中能夠看出,其實咱們採用的基本是一種相似黑盒的測試方式,也就是說,咱們根本沒有分析這些動態網頁的構成,只是單純的將網頁讓瀏覽器去解析,而後咱們取得結果,(固然這裏先不考慮一些複雜的ajax請求)。這裏有兩個要素,一就是瀏覽器,使用的web driver;二就是瀏覽器去解析,並作了請求和響應。服務器
爲何我不能採用分佈式處理呢?利用客戶端的資源來解析動態網頁,這樣不就減輕了壓力,並且能夠大大增長處理地址的能力。個人想法是這樣的:多線程
一、開發一個簡單的網頁,用來訪問。例如一個jspdom
二、將須要進行解析的地址經過參數的形式傳給這個頁面。例如採用xxx.jsp?url='www.sina.com.cn'jsp
三、後臺截獲這個req,而後根據新的url也就是"http://www.sina.com.cn",發起一個新的httprequest,將這個response,write給前面這個res.分佈式
這樣其實就是將sina的respose,交給了我這個jsp。
四、這樣,我就能夠作一些手腳,例如獲取response的時候,採用html解析器,並利用規則過濾掉一些元素或者添加一些咱們須要的腳本代碼,並將這個修改後的response,交個瀏覽器去執行。最後獲取執行後的結果,再交給服務器處理或者保存。
這樣就避免掉一開始的一些問題。首先,與瀏覽器driver無關,也就是說若是用ie訪問,就利用ie引擎;用firefox訪問,就利用firefox引擎。就能夠脫離web driver。其次,能夠對結果進行自由控制,採用html解析器,就能夠按照本身的規則來過濾響應。最後,利用這種方式就是一種分佈式的處理,也就是說凡是訪問我頁面的瀏覽器,均可以用來進行頁面解析,並且能夠不佔用我服務器的帶寬。
可見的問題在於:
一、如何控制客戶端去訪問我想要的網址。
二、如何將訪問後的內容傳回後臺處理。
三、因爲篡改了響應,帶來的Cross Domain的問題會不會影響到個人解析結果。
四、如何知道頁面已經加載完畢。
五、採用何種解析器解析。
因爲這兩天公司正在搬家,暫時要緩緩,不過上面的問題我已經有了一個初步的解決辦法,不過仍需驗證。不管結果如何,過幾天再聊。呵呵