使用scrapy,redis, mongodb,graphite實現的一個分布式網絡爬蟲:distribute_crawler

jopen 9年前發布 | 53K 次閱讀 網絡爬蟲 distribute_crawler

使用scrapy,redis, mongodb,graphite實現的一個分布式網絡爬蟲,底層存儲mongodb集群,分布式使用redis實現, 爬蟲狀態顯示使用graphite實現。

這個工程是我對垂直搜索引擎中分布式網絡爬蟲的探索實現,它包含一個針對http://www.woaidu.org/ 網站的spider,將其網站的書名,作者,書籍封面圖片,書籍概要,原始網址鏈接,書籍下載信息和書籍爬取到本地:

  • 分布式使用redis實現,redis中存儲了工程的request,stats信息,能夠對各個機器上的爬蟲實現集中管理,這樣可以解決爬蟲的性能瓶頸,利用redis的高效和易于擴展能夠輕松實現高效率下載:當redis存儲或者訪問速度遇到瓶頸時,可以通過增大redis集群數和爬蟲集群數量改善。
  • 底層存儲實現了兩種方式:
    • 將書名,作者,書籍封面圖片文件系統路徑,書籍概要,原始網址鏈接,書籍下載信息,書籍文件系統路徑保存到mongodb 中,此時mongodb使用單個服務器,對圖片采用圖片的url的hash值作為文件名進行存儲,同時可以定制生成各種大小尺寸的縮略圖,對文件動態獲得文件名,將其下載到本地,存儲方式和圖片類似,這樣在每次下載之前會檢查圖片和文件是否曾經下載,對已經下載的不再下載;
    • 將書名,作者,書籍封面圖片文件系統路徑,書籍概要,原始網址鏈接,書籍下載信息,書籍保存到mongodb中,此時mongodb 采用mongodb集群進行存儲,片鍵和索引的選擇請看代碼,文件采用mongodb的gridfs存儲,圖片仍然存儲在文件系統中,在每次下載之前會檢查圖片和文件是否曾經下載,對已經下載的不再下載;
  • 避免爬蟲被禁的策略:
    • 禁用cookie
    • 實現了一個download middleware,不停的變user-aget
    • 實現了一個可以訪問google cache中的數據的download middleware(默認禁用)
  • 調試策略的實現:
    • 將系統log信息寫到文件中
    • 對重要的log信息(eg:drop item,success)采用彩色樣式終端打印
  • 文件,信息存儲:
    • 實現了FilePipeline可以將指定擴展名的文件下載到本地
    • 實現了MongodbWoaiduBookFile可以將文件以gridfs形式存儲在mongodb集群中
    • 實現了SingleMongodbPipeline和ShardMongodbPipeline,用來將采集的信息分別以單服務器和集群方式保存到mongodb中
  • 訪問速度動態控制:
    • 跟據網絡延遲,分析出scrapy服務器和網站的響應速度,動態改變網站下載延遲
    • 配置最大并行requests個數,每個域名最大并行請求個數和并行處理items個數
  • 爬蟲狀態查看:
    • 將爬蟲stats信息(請求個數,文件下載個數,圖片下載個數等)保存到redis中
    • 實現了一個針對分布式的stats collector,并將其結果用graphite以圖表形式動態實時顯示
  • mongodb集群部署:在commands目錄下有init_sharding_mongodb.py文件,可以方便在本地部署

需要的其他的庫

  • scrapy(最好是最新版)
  • graphite(針對他的配置可以參考:statscol/graphite.py)
  • redis
  • mongodb

可重用的組件

  • 終端彩色樣式顯示(utils/color.py)
  • 在本地建立一個mongodb集群(commands/init_sharding_mongodb.py),使用方法:
   sudo python init_sharding_mongodb.py --path=/usr/bin
  • 單機graphite狀態收集器(statscol.graphite.GraphiteStatsCollector)
  • 基于redis分布式的graphite狀態收集器(statscol.graphite.RedisGraphiteStatsCollector)
  • scrapy分布式處理方案(scrapy_redis)
  • rotate user-agent download middleware(contrib.downloadmiddleware.rotate_useragent.RotateUserAgentMiddleware)
  • 訪問google cache的download middleware(contrib.downloadmiddleware.google_cache.GoogleCacheMiddleware)
  • 下載指定文件類型的文件并實現避免重復下載的pipeline(pipelines.file.FilePipeline)
  • 下載制定文件類型的文件并提供mongodb gridfs存儲的pipeline(pipelines.file.MongodbWoaiduBookFile)
  • item mongodb存儲的pipeline(pipelines.mongodb.SingleMongodbPipeline and ShardMongodbPipeline)

使用方法

mongodb集群存儲

  • 安裝scrapy
  • 安裝redispy
  • 安裝pymongo
  • 安裝graphite(如何配置請查看:statscol/graphite.py)
  • 安裝mongodb
  • 安裝redis
  • 下載本工程
  • 啟動redis server
  • 搭建mongodb集群
      cd woaidu_crawler/commands/
      sudo python init_sharding_mongodb.py --path=/usr/bin
  • 在含有log文件夾的目錄下執行:
      scrapy crawl woaidu
  • 打開http://127.0.0.1/ 通過圖表查看spider實時狀態信息
  • 要想嘗試分布式,可以在另外一個目錄運行此工程

mongodb

  • 安裝scrapy
  • 安裝redispy
  • 安裝pymongo
  • 安裝graphite(如何配置請查看:statscol/graphite.py)
  • 安裝mongodb
  • 安裝redis
  • 下載本工程
  • 啟動redis server
  • 搭建mongodb服務器
      cd woaidu_crawler/commands/
      python init_single_mongodb.py 
  • 設置settings.py:
      ITEM_PIPELINES = ['woaidu_crawler.pipelines.cover_image.WoaiduCoverImage',
          'woaidu_crawler.pipelines.bookfile.WoaiduBookFile',
          'woaidu_crawler.pipelines.drop_none_download.DropNoneBookFile',
          'woaidu_crawler.pipelines.mongodb.SingleMongodbPipeline',
          'woaidu_crawler.pipelines.final_test.FinalTestPipeline',]
  • 在含有log文件夾的目錄下執行:
      scrapy crawl woaidu
  • 打開http://127.0.0.1/ (也就是你運行的graphite-web的url) 通過圖表查看spider實時狀態信息
  • 要想嘗試分布式,可以在另外一個目錄運行此工程

注意

每次運行完之后都要執行commands/clear_stats.py文件來清除redis中的stats信息

     python clear_stats.py

Screenshots

graphite book_files book_files images terminal

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

 

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