Scrapy-redis改造scrapy實現分布式多進程爬取


一.基本原理: 
Scrapy-Redis則是一個基於Redis的Scrapy分布式組件。它利用Redis對用於爬取的請求(Requests)進行存儲和調度(Schedule),並對爬取產生的項目(items)存儲以供后續處理使用。scrapy-redi重寫了scrapy一些比較關鍵的代碼,將scrapy變成一個可以在多個主機上同時運行的分布式爬蟲。 
參考Scrapy-Redis官方github地址

二.准備工作: 
1.安裝並啟動redis,Windows和lunix可以參考這篇 
2.scrapy+Python環境安裝 
3.scrapy_redis環境安裝

$ pip install scrapy-redis $ pip install redis

三.改造scrapy爬蟲: 
1.首先在settings.py中配置redis(在scrapy-redis 自帶的例子中已經配置好)

   SCHEDULER = "scrapy_redis.scheduler.Scheduler" SCHEDULER_PERSIST = True SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderPriorityQueue' REDIS_URL = None # 一般情況可以省去 REDIS_HOST = '127.0.0.1' # 也可以根據情況改成 localhost REDIS_PORT = 6379

2.item.py的改造

from scrapy.item import Item, Field from scrapy.loader import ItemLoader from scrapy.loader.processors import MapCompose, TakeFirst, Join  class ExampleItem(Item): name = Field() description = Field() link = Field() crawled = Field() spider = Field() url = Field() class ExampleLoader(ItemLoader): default_item_class = ExampleItem default_input_processor = MapCompose(lambda s: s.strip()) default_output_processor = TakeFirst() description_out = Join()

3.spider的改造。star_turls變成了redis_key從redis中獲得request,繼承的scrapy.spider變成RedisSpider。

from scrapy_redis.spiders import RedisSpider class MySpider(RedisSpider): """Spider that reads urls from redis queue (myspider:start_urls).""" name = 'myspider_redis' redis_key = 'myspider:start_urls' def __init__(self, *args, **kwargs): # Dynamically define the allowed domains list. domain = kwargs.pop('domain', '') self.allowed_domains = filter(None, domain.split(',')) super(MySpider, self).__init__(*args, **kwargs) def parse(self, response): return { 'name': response.css('title::text').extract_first(), 'url': response.url, }

四.啟動爬蟲:

$ scrapy crawl myspider

可以輸入多個來觀察多進程的效果。。打開了爬蟲之后你會發現爬蟲處於等待爬取的狀態,是因為list此時為空。所以需要在redis控制台中添加啟動地址,這樣就可以愉快的看到所有的爬蟲都動起來啦。

lpush mycrawler:start_urls http://www.***.com

redis數據庫中可以看到如下三項,第一個為已過濾並下載的request,第二個公用item,第三個為待處理request。 
這里寫圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM