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。 
这里写图片描述

猜你喜欢

转载自www.cnblogs.com/zxtceq/p/8985639.html