爬蟲框架:go_spider

jopen 9年前發布 | 41K 次閱讀 go_spider 網絡爬蟲

爬蟲框架:go_spider
簡介

本項目基于golang開發,是一個開放的垂直領域的爬蟲引擎,主要希望能將各個功能模塊區分開,方便使用者重新實現子模塊,進而構建自己垂直方方向的爬蟲。

本項目將爬蟲的各個功能流程區分成Spider模塊(主控),Downloader模塊(下載器),PageProcesser模塊(頁面分析),Scheduler模塊(任務隊列),Pipeline模塊(結果輸出);

執行過程簡述:

  1. Spider從Scheduler中獲取包含待抓取url的Request對象,啟動一個協程,一個協程執行一次爬取過程,此處我們把協程也看成 Spider,Spider把Request對象傳入Downloader,Downloader下載該Request對象中url所對應的頁面或者其他 類型的數據,生成Page對象;
  2. Spider調用PageProcesser模塊解析Page對象中的頁面數據,并存入Page對象中的PageItems中(以Key- Value對的形式保存),同時存入解析結果中的待抓取鏈接,Spider會將待抓取鏈接存入Scheduler模塊中的Request隊列中;
  3. Spider調用Pipeline模塊輸出Page中的PageItems的結果;
  4. 執行步驟1,直至Scheduler中所有鏈接被處理完成,則Spider被掛起等待下一個待抓取鏈接或者終止。

爬蟲框架:go_spider

執行過程相應的Spider核心代碼,代碼代表一次爬取過程:

// core processer
func (this *Spider) pageProcess(req *request.Request) {
    // Get Page
    p := this.pDownloader.Download(req)
    if p == nil {
        return
    }

    // Parse Page
    this.pPageProcesser.Process(p)
    for _, req := range p.GetTargetRequests() {
        this.addRequest(req)
    }

    // Output
    if !p.GetSkip() {
        for _, pip := range this.pPiplelines {
            pip.Process(p.GetPageItems(), this)
        }
    }

    this.sleep()
}

項目安裝與示例執行

  • 安裝本包和依賴包
    go get github.com/hu17889/go_spider
    go get github.com/PuerkitoBio/goquery
    go get github.com/bitly/go-simplejson

示例執行:

  • 編譯:go install github.com/hu17889/go_spider/example/github_repo_page_processor
  • 執行:./bin/github_repo_page_processor

展示一個簡單爬蟲示例

示例的功能是爬取https://github.com/hu17889?tab=repositories下面的項目以及項目詳情頁的相關信息,并將內容輸出到標準輸出。

一般在自己的爬蟲main包中需要實現爬蟲創建,初始化,以及PageProcesser模塊的繼承實現。可以實現自己的子模塊或者使用項目中已經存在的子模塊,通過Spider對象中相應的Set或者Add函數將模塊引入爬蟲。本項目支持鏈式調用

spider.NewSpider(NewMyPageProcesser(), "TaskName").                // 創建PageProcesser和Spider,設置任務名稱
    AddUrl("https://github.com/hu17889?tab=repositories", "html"). // 加入初始爬取鏈接,需要設置爬取結果類型,方便找到相應的解析器
    AddPipeline(pipeline.NewPipelineConsole()).                    // 引入PipelineConsole輸入結果到標準輸出
    SetThreadnum(3).                                               // 設置爬取參數:并發個數
    Run()                                                          // 開始執行

項目主頁:http://www.baiduhome.net/lib/view/home/1420889510328

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!