使用scrapy,redis, mongodb,graphite實現的一個分布式網絡爬蟲: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
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!