算法分析
我們現在從需求中提取關鍵詞來逐漸分析問題。
首先是“種子節點”。它就是一個或多個在爬蟲程式運作前手動給出的URL(網址),爬蟲正是下載下傳并解析這些種子URL指向的頁面,從中提取出新的URL,然後重複以上的工作,直到達到設定的條件才停止。
最後是“設定的條件”,爬蟲程式終止的條件可以根據實際情況靈活設定,比如設定爬取時間,爬取數量,爬行深度等。
到此,我們分析完了爬蟲如何開始,怎麼運作,如何結束(當然,要實作一個強大,完備的爬蟲要考慮的遠比這些複雜,這裡隻是入門分析),下面給出整個運作的流程圖:
資料結構分析
根據以上的分析,我們需要用一種資料結構來儲存初始的種子URL和解析下載下傳的頁面得到的URL,并且我們希望先解析出的URL先執行請求,是以我們用隊列來儲存URL。因為我們要頻繁的添加,取出URL,是以我們采用鍊式存儲。下載下傳的頁面解析後直接原封不動的儲存到磁盤。
技術分析
所謂網絡爬蟲,我們當然要通路網絡,我們這裡使用jsoup,它對http請求和html解析都做了良好的封裝,使用起來十分友善。根據資料結構分析,我們用LinkedList實作隊列,用來儲存未通路的URL,用HashSet來儲存通路過的URL(因為我們要大量的判斷該URL是否在該集合内,而HashSet用元素的Hash值作為“索引”,查找速度很快)。
代碼
以上分析,我們一共要實作2個類:
① JsoupDownloader,該類是對Jsoup做一個簡單的封裝,友善調用。暴露出以下幾個方法:
—public Document downloadPage(String url);根據url下載下傳頁面 —public Set<String> parsePage(Document doc, String regex);從Document中解析出比對regex的url。 —public void savePage(Document doc, String saveDir, String saveName, String regex);儲存比對regex的url對應的Document到指定路徑。
② UrlQueue,該類用來儲存和擷取URL。暴露出以下幾個方法:
—public void enQueue(String url);添加url。 —public String deQueue();取出url。 —public int getVisitedCount();擷取通路過的url的數量;
<a></a>
注:userRequest\\?userRequest=showNoParticipateTask&taskid=\\d{1,2} 是本地的網站中網頁裡的位址,當然種子位址也是本地網站!
在請求這個位址後會産生位址重定向,到部落格園位址http://www.cnblogs.com/hujunzheng/,并完成相應的下載下傳!
1.這是請求逾時的情況
2.正常通路或者重定向通路
本文轉自 小眼兒 部落格園部落格,原文連結:http://www.cnblogs.com/hujunzheng/p/4852948.html,如需轉載請自行聯系原作者