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

  • 相关阅读:
    linux通过源码安装nodejs
    设置npm的镜像源
    ubuntu手动安装PhantomJS
    h2数据库的简单使用
    xampp启动失败 Apache shutdown unexpectedly
    phpqrcode实现二维码(含图片)
    php 使用 rabbitmq
    rabbitMQ linux安装
    rabbitmq的web管理界面无法使用guest用户登录
    linux安装使用xdebug
  • 原文地址:https://www.cnblogs.com/zxtceq/p/8985639.html
Copyright © 2020-2023  润新知