Scrapy-redis改造scrapy实现分布式多进程爬取

来源:互联网 发布:registax mac 编辑:程序博客网 时间:2024/06/06 09:20

一.基本原理:
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, Fieldfrom scrapy.loader import ItemLoaderfrom scrapy.loader.processors import MapCompose, TakeFirst, Joinclass 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 RedisSpiderclass 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。
这里写图片描述

原创粉丝点击