zoukankan      html  css  js  c++  java
  • 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。 
    这里写图片描述

  • 相关阅读:
    POJ 1328 Radar Installation
    POJ 1700 Crossing River
    POJ 1700 Crossing River
    poj 3253 Fence Repair (贪心,优先队列)
    poj 3253 Fence Repair (贪心,优先队列)
    poj 3069 Saruman's Army(贪心)
    poj 3069 Saruman's Army(贪心)
    Redis 笔记与总结2 String 类型和 Hash 类型
    数据分析方法有哪些_数据分析方法
    数据分析方法有哪些_数据分析方法
  • 原文地址:https://www.cnblogs.com/zxtceq/p/8985639.html
Copyright © 2011-2022 走看看