基於HttpClient4.0的網絡爬蟲基本框架(Java實現)


上個學期做了很久的新浪爬蟲,修修改改一直沒時間做個整理,趁着開學前,重新整理了下思路和代碼結構,做一個總結吧。

本來是雄心壯志的想實現一個Java版本的、比較通用的爬蟲框架的,但是整理后又發現此法真的是非常的簡單粗暴,跟scrapy等沒得比,其實沒得比都是正常的啦,我自己本來就水,而且沒有深入的去進行實現設計,所以,姑且總結一下當前的能力吧。

實現語言:Java

模擬HTTP請求:HttpClient 4.0

目標頁面結構分析、HTTP請求頭信息分析:Firefox + firebug / Chrome(F12 開發者模式)

HTML解析:Jsoup

基本思路

網絡爬蟲的基本思路是:爬蟲線程從待抓取URL隊列中拿取一個URL -> 模擬瀏覽器GET請求到目標URL -> 將網頁內容下載回來 -> 然后對頁面的內容進行解析、獲取目標數據保存到相應的存儲 -> 再以一定的規則從當前抓取的網頁中獲取接下來需要繼續爬取的URL。

當然以上思路是建立在爬取過程無需模擬登錄、被爬的網站比較善良不會做一些“反爬”的工作的基礎上,然而現實中,模擬登錄有時還是非常重要的(如新浪微博);不會反爬的網站也少之又少,當頻訪問站點時,可能會被凍結賬號、封IP、返回“系統繁忙”“請慢點兒訪問”等信息。因此需要對爬蟲進行健壯性增強:增加對反爬信息的處理、動態切換賬號/IP、訪問時間delay等。

程序架構

由於模擬登錄模塊比較復雜,並且不同的網站實現的機制也不盡相同,因此這里只給出一個示意圖,下文主要針對不需要進行登錄的爬蟲進行分析。

Worker:每一個worker就是一個爬蟲線程,由主線程SpiderStarter創建

Login(可選):爬蟲模擬登錄模塊,可以設置一個賬號隊列,一旦賬號被凍結,則將其放入隊列尾部,並從頭部獲取一個新賬號再次登錄。隊列的長度需 >= 賬號凍結時間 / 每個賬號可以支持的連續爬取時間

Fetcher:爬蟲模擬瀏覽器發出GET URL請求,下載頁面

Handler:對Fetcher下載的頁面進行初步處理,如判斷該頁面的返回狀態碼是否正確、頁面內容是否為反爬信息等,從而保證傳到Parser進行解析的頁面是正確的

Parser:對Fetcher下載的頁面內容進行解析,獲取目標數據

Store:將Parser解析出的目標數據存入本地存儲,可以是MySQL傳統數據庫,也可以Redis等KV存儲

待抓取隊列:存放需要抓取的URL

已抓取隊列:存放已經抓取到的頁面的URL

程序流程圖

以下為爬蟲實現的流程圖,圖中綠色方框代表這幾個步驟是在同一個模塊中的,模塊名稱用紅字表明。

代碼實現

明天就開學了,再加上實驗室的任務,沒時間好好寫了,寫了個比較水的,eclipse工程,大概就是把上面這個流程圖給實現了,很多地方需要根據具體的爬取場景進行實現的都用注釋說明了,真心希望以后可以封裝的漂亮點兒。

丑媳婦見公婆來了。點我看丑 >_<~

 

最后,附加淘寶搜索團隊的兩篇關於爬蟲的文章,感覺挺好的,很清晰的結構。有時間可以實現部署一下:

定向抓取漫談

快速構建時時抓取集群

 


免責聲明!

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



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