美文网首页
分布式部署爬虫

分布式部署爬虫

作者: 郭祺迦 | 来源:发表于2018-10-09 21:29 被阅读0次

    redis是不支持Windows,只支持linux。有人开发了一套,可以直接使用

    windows下的配置:

    bind 127.0.0.1将这一行注释起来
    protected_mode  no  将yes修改为no即可
    

    redis的可视化工具:redis desktop manager

    分布式部署:

      实现多台电脑共同爬取
    

    scrapy支持分布式吗?不支持分布式

    怎么办?
    有人开发了一套基于scrapy的组件scrapy-redis,通过这套组件写的代码就可以实现分布式
    https://github.com/rmax/scrapy-redis
    scrapy-redis不是框架,是一套基于scrapy的组件

    安装:

    pip install scrapy-redis
    

    添加起始url

    lpush qingspider:start_urls 起始的url
    

    执行:

    scrapy runspider xxx.py
    

    下面是关于spider 和crawlspider的官方重写方法

    redisspider的方法:

    from scrapy_redis.spiders import RedisSpider
    
    '''
    如果以前你的scrapy是通过Spider写的
    现在你要实现分布式,参考这个模板即可
    '''
    class MySpider(RedisSpider):
        """Spider that reads urls from redis queue (myspider:start_urls)."""
        name = 'myspider_redis'
        # start_url
        redis_key = 'myspider:start_urls'
    
        # 构造方法,初衷非常好,想用这个方法动态定义允许域名列表,然后就不用allowed_domains
        # 实际操作,是一个坑,这个方法不能使用,还得使用allowed_domains
        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,
            }
    

    rediscrawlspider的方法:

    from scrapy.spiders import Rule
    from scrapy.linkextractors import LinkExtractor
    
    from scrapy_redis.spiders import RedisCrawlSpider
    '''
    如果以前你的scrapy是通过CrawlSpider写的
    现在你要实现分布式,参考这个模板即可
    '''
    
    class MyCraw'''
    如果以前你的scrapy是通过Spider写的
    现在你要实现分布式,参考这个模板即可
    '''ler(RedisCrawlSpider):
        """Spider that reads urls from redis queue (myspider:start_urls)."""
        name = 'mycrawler_redis'
        redis_key = 'mycrawler:start_urls'
    
        rules = (
            # follow all links
            Rule(LinkExtractor(), callback='parse_page', follow=True),
        )
        # 构造方法,初衷非常好,想用这个方法动态定义允许域名列表,然后就不用allowed_domains
        # 实际操作,是一个坑,这个方法不能使用,还得使用allowed_domains
    
        def __init__(self, *args, **kwargs):
            # Dynamically define the allowed domains list.
            domain = kwargs.pop('domain', '')
            self.allowed_domains = filter(None, domain.split(','))
            super(MyCrawler, self).__init__(*args, **kwargs)
    
        def parse_page(self, response):
            return {
                'name': response.css('title::text').extract_first(),
                'url': response.url,
            }
    

    settings.py的配置

    SPIDER_MODULES = ['example.spiders']
    NEWSPIDER_MODULE = 'example.spiders'
    
    USER_AGENT = 'scrapy-redis (+https://github.com/rolando/scrapy-redis)'
    
    # 去重类
    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
    # 调度器
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"
    # 允许暂停
    SCHEDULER_PERSIST = True
    
    #SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
    #SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
    #SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"
    
    ITEM_PIPELINES = {
        'example.pipelines.ExamplePipeline': 300,
        # redis管道   开启管道,写入redis,默认是写到本机redis服务中
        'scrapy_redis.pipelines.RedisPipeline': 400,
    }
    
    # 配置写入其它机器redis服务
    REDIS_HOST = '10.0.1.1'
    REDIS_PORT = 6379
    
    LOG_LEVEL = 'DEBUG'
    
    # Introduce an artifical delay to make use of parallelism. to speed up the
    # crawl.
    DOWNLOAD_DELAY = 1
    

    如果你想继续用你的settings.py文档,那怎么定制你的分布式的settings的配置呢?

    在你的爬中文件类中写:

        custom_settings = {
            # 去重类
            'DUPEFILTER_CLASS': "scrapy_redis.dupefilter.RFPDupeFilter",
            # 调度器
            'SCHEDULER': "scrapy_redis.scheduler.Scheduler",
            # 允许暂停
            'SCHEDULER_PERSIST': True,
            'ITEM_PIPELINES': {
                'scrapy_redis.pipelines.RedisPipeline': 400,
            },
            # 配置写入其它机器redis服务
            'REDIS_HOST': '10.0.120.89',
            'REDIS_PORT': '6379',
            'DOWNLOAD_DELAY': 1,
        }
       其他的和spider和crawlspider一样写即可
    

    相关文章

      网友评论

          本文标题:分布式部署爬虫

          本文链接:https://www.haomeiwen.com/subject/xvzyaftx.html