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

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




     
     






















    以上内容作为课堂笔记,如有雷同,请联系于我
  • 相关阅读:
    keil 提示"running with code size limit 32k"
    关于C语言编译出现give arg types警告问题
    windows10添加设备管理器的快捷方式到桌面
    deepin20社区版 安装 STM32CubeIDE 小记
    STM32开发 printf和scanf函数的重定向——修改HAL标准库用printf函数发送数据直接输出
    ardupilot环境配置之eclipse指定jdk版本启动,解决“Version XXXX of the JVM is not ......"报错的问题
    jdk9,10,11,12没有jre安装方法
    C++ 类构造函数 & 析构函数
    STM32 Keil中关于stlink的调试 下载设置
    STM32 SWD下载出现no target connect解决方法
  • 原文地址:https://www.cnblogs.com/ArtisticMonk/p/9749955.html
Copyright © 2011-2022 走看看