爬蟲那些事-爬蟲設計思路

zhanghouse1發表於2017-08-02

一、前言

爬蟲廣泛使用於搜尋引擎、新聞聚合以及大資料採集當中,一個良好的爬蟲系統需要考慮很多方面:爬蟲種子的獲取需要有個穩定的任務排程機制,下載頁面過程需要考慮到網頁內容的生成是否是需要js渲染,請求網頁是否需要設定請求頭,還有請求過多會不會被對方封鎖。另外就是資料處理過程,什麼頁面需要進行資料提取,什麼頁面是分裂成其它頁面,還有頁面內容提取需要採用什麼手段:比如css selector解析,xpath解析,還有許多內容是通過json格式返回 需要解析json,還有的內容是屬於xml,這就需要你都還有當獲取到結果之後需要對結果進行整理、規範化和持久化。

二、設計思路


           圖2-1 設計思路

     因為工作當中主要是對新聞內容進行抓取,所以結合新聞資訊進行處理。如圖2-1所示,一個典型的新聞網站會分兩個頁面進行展示,一個是列表頁一個是詳情頁,我們要從列表頁進行處理分裂出詳情頁,然後下載詳情頁進行處理提取裡面的詳情頁。最後對提取的結果進行處理,處理的結果後面可以接入其它流程如更進一步的清洗等,最後經過持久話的內容最終可以通過業務流程處理出去。當一個業務流程抓住輸入輸出,然後結構化和剖析這個流程後,就會知道怎麼進行設計了。

三、爬蟲系統架構圖


圖3-1 技術架構

相信接觸過scrapy及其它第三方開源抓取工具應該對上面的圖不會陌生,系統也是參考java一個比較出名的框架webmagic程式處理的,基於元件化進行開發:

    爬蟲系統通過scheduler獲取待抓取任務,系統需要考慮到多種可排程的方式,這就需要設計一種可以通過配置選擇不同排程模組的功能,比如來自redis的任務排程、來自MQ的任務,也可能來自檔案和資料庫的排程。另外從頁面解析的request同樣也需要丟到scheduler進行排程。

   Downloader下載器,下載網頁詳情有多種java中api提供java.net.URL、java.net.URLConnection 以及HttpClient進行下載,然後還有諸如Https的處理等。

PageProcess頁面處理器,通常情況下鎖抽取的內容就需要在這邊進行處理,同時可以分裂出新的連結,解析HTML可以自己定製使用JSOUP,XPATH以及json 、xml解析。

Pipeline負責抽取結果的處理,包括計算、持久化到檔案、資料庫等


三、整體的技術選型


    圖3-2

如上圖所示,資料來源種子儲存在DB中,然後用redis快取,抓取系統基於redis做排程。排程程式和爬蟲主程式採用RabbitMQ(zeroMq,kafuka也可以)做解耦,然後抓取過程中可以用Redis做連結URL去重處理,然後如果網頁內容多種多樣可以用MongoDB 這種NoSql資料庫做儲存。利用其文件儲存以及key 、value的優勢進行非結構化的持久化,最後抓取的資料可以進一步推送到清洗程式中處理。然後處理後的資料最後存到關係型資料庫Mysql中,然後通過業務邏輯處理展示到PC和手機端。

上面就是整個爬蟲系統的設計。。



相關文章