zoukankan      html  css  js  c++  java
  • scrapy-redis分布式爬虫

    分布式问题:
        request队列集中管理

        去重集中管理

        储存管理

    可以上github上面找一下scrapy-redis

    
    

    相关模块 redis

    settings相关设置

    #使用scrapy-redis里的去重组件,不使用scrapy默认的去重方式
    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
    
    #使用scrapy-redis里的调度器组件,不使用默认的
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"
    
    #允许暂停,redis请求记录不丢失
    SCHEDULER_PERSIST = True
    
    #默认的scrapy-redis请求队列形式(按优先级)
    SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
    
    #队列形式,先进先出
    SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
    
    #栈形式,请求先进后出
    SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"
    
    #只是将数据放到redis数据库,不需要写pipeline,存储到mysql还是需要写的
    ITEM_PIPELINES = {
        'scrapy_redis.pipelines.RedisPipeline':400
    }
    
    
    
    
    #链接redis数据库
    
    REDIS_URL = 'redis://:@127.0.0.1:6379'

    运行分布式爬虫

    scrapy runspider myspider.py
    #后面的py文件是你需要运行的分布式爬虫的文件名
    命令行启动后,会在自行等待监听redis上的url
    也就是在spider上面设置的redis_key = 'mybaike:start_url'
    然后后在redis上lpush一个健名和url
    #比如:
        # lpush mybaike:start_url "http://www.baike.com"

    redis中默认生成的健有:
    myspider:request
    
    myspider:dupefilter
    
    #如果打开item管道存储在redis的数据的话,就还有这这么一个字段
    myspider:item

    #在redis中删除所有的键命令为:flushdb
    #查看所有键:keys *

    spider.py ##基于RedisCrawlSpider,也就是翻页的时候使用Crawl的需要继承与这个类
    import scrapy
    from scrapy.selector import Selector
    from Scrapy_Redist.items import ScrapyRedistItem
    from scrapy_redis.spiders import RedisCrawlSpider
    from scrapy.linkextractor import LinkExtractor
    from scrapy.spiders import CrawlSpider,Rule
    
    class MybaidukeSpider(RedisCrawlSpider):                  ##基于RedisCrawlSpider
        name = 'mybaike'
        alloweb_domains = ['baike.baidu.com']
        # start_urls = ['https://baike.baidu.com/item/Python/407313']
        redis_key = 'mybaike:start_url'
        rules = [Rule(LinkExtractor(allow=("item/(.*)")),callback="get_parse",follow=True)]
        def get_parse(self,response):
            items = ScrapyRedistItem()
    
            Seit = Selector(response)
            title = Seit.xpath('//dd[@class="lemmaWgt-lemmaTitle-title"]/h1/text()').extract()
            contentList = Seit.xpath('//div[@class="lemma-summary"]//text()')
            content = ''
            for c in contentList:
                content += c.extract().strip()
    
            items['title'] = title
            items['content'] = content
            yield items
    import scrapy
    from scrapy.selector import Selector
    from Scrapy_Redist.items import ScrapyRedistItem
    
    from scrapy_redis.spiders import RedisSpider
    
    class MybaidukeSpider(RedisSpider):
        name = 'mybaike'
        alloweb_domains = ['baike.baidu.com']
        # start_urls = ['https://baike.baidu.com/item/Python/407313']
    redis_key = 'mybaike:start_url'
      #这句话很重要哦,也就是写在redis中键

    #rules = [Rule(LinkExtractor(allow=("item/(.*)")),callback="get_parse",follow=True)]# 如果自己写一个翻页的花就继承于 RedisSpider

    def get_parse(self,response): items = ScrapyRedistItem() Seit = Selector(response) title = Seit.xpath('//dd[@class="lemmaWgt-lemmaTitle-title"]/h1/text()').extract() contentList = Seit.xpath('//div[@class="lemma-summary"]//text()') content = '' for c in contentList: content += c.extract().strip() items['title'] = title items['content'] = content yield items

    其他的也就差不多一样的了




     
     






















    以上内容作为课堂笔记,如有雷同,请联系于我
  • 相关阅读:
    SharePoint 2013 安装.NET Framework 3.5 报错
    SharePoint 2016 配置工作流环境
    SharePoint 2016 站点注册工作流服务报错
    Work Management Service application in SharePoint 2016
    SharePoint 2016 安装 Cumulative Update for Service Bus 1.0 (KB2799752)报错
    SharePoint 2016 工作流报错“没有适用于此应用程序的地址”
    SharePoint 2016 工作流报错“未安装应用程序管理共享服务代理”
    SharePoint JavaScript API in application pages
    SharePoint 2016 每天预热脚本介绍
    SharePoint 无法删除搜索服务应用程序
  • 原文地址:https://www.cnblogs.com/ArtisticMonk/p/9749955.html
Copyright © 2011-2022 走看看