天天看點

網絡爬蟲(1)

算法分析

    我們現在從需求中提取關鍵詞來逐漸分析問題。

    首先是“種子節點”。它就是一個或多個在爬蟲程式運作前手動給出的url(網址),爬蟲正是下載下傳并解析這些種子url指向的頁面,從中提取出新的url,然後重複以上的工作,直到達到設定的條件才停止。

網絡爬蟲(1)

    最後是“設定的條件”,爬蟲程式終止的條件可以根據實際情況靈活設定,比如設定爬取時間,爬取數量,爬行深度等。

    到此,我們分析完了爬蟲如何開始,怎麼運作,如何結束(當然,要實作一個強大,完備的爬蟲要考慮的遠比這些複雜,這裡隻是入門分析),下面給出整個運作的流程圖:

網絡爬蟲(1)

 資料結構分析

    根據以上的分析,我們需要用一種資料結構來儲存初始的種子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的數量;
網絡爬蟲(1)

繼續閱讀