上個學期做了很久的新浪爬蟲,修修改改一直沒時間做個整理,趁着開學前,重新整理了下思路和代碼結構,做一個總結吧。
本來是雄心壯志的想實現一個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工程,大概就是把上面這個流程圖給實現了,很多地方需要根據具體的爬取場景進行實現的都用注釋說明了,真心希望以后可以封裝的漂亮點兒。
丑媳婦見公婆來了。點我看丑 >_<~
最后,附加淘寶搜索團隊的兩篇關於爬蟲的文章,感覺挺好的,很清晰的結構。有時間可以實現部署一下: