zoukankan      html  css  js  c++  java
  • 爬虫(十七):scrapy分布式原理

    一:scrapy工作流程

    scrapy单机架构:

    单主机爬虫架构:

    分布式爬虫架构:

    这里重要的就是我的队列通过什么维护?
    这里一般我们通过Redis为维护,Redis,非关系型数据库,Key-Value形式存储,结构灵活。
    并且redis是内存中的数据结构存储系统,处理速度快,提供队列集合等多种存储结构,方便队列维护

    如何去重?
    这里借助redis的集合,redis提供集合数据结构,在redis集合中存储每个request的指纹
    在向request队列中加入Request前先验证这个Request的指纹是否已经加入集合中。如果已经存在则不添加到request队列中,如果不存在,则将request加入到队列并将指纹加入集合

    如何防止中断?如果某个slave因为特殊原因宕机,如何解决?
    这里是做了启动判断,在每台slave的Scrapy启动的时候都会判断当前redis request队列是否为空
    如果不为空,则从队列中获取下一个request执行爬取。如果为空则重新开始爬取,第一台丛集执行爬取向队列中添加request

    如何实现上述这种架构?
    这里有一个scrapy-redis的库,为我们提供了上述的这些功能
    scrapy-redis改写了Scrapy的调度器,队列等组件,利用他可以方便的实现Scrapy分布式架构
    关于scrapy-redis的地址--》scrapy-redis GitHub地址

    二:搭建分布式爬虫

    参考--》官网地址

    前提是要安装scrapy_redis模块:pip install scrapy_redis
    这里的爬虫代码是用的之前写过的爬取知乎用户信息的爬虫

    修改该settings中的配置信息:

    替换scrapy调度器
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"

    添加去重的class
    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

    添加pipeline
    如果添加这行配置,每次爬取的数据也都会入到redis数据库中,所以一般这里不做这个配置
    ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 300
    }

    共享的爬取队列,这里用需要redis的连接信息
    这里的user:pass表示用户名和密码,如果没有则为空就可以
    REDIS_URL = 'redis://user:pass@hostname:9001'

    设置为为True则不会清空redis里的dupefilter和requests队列
    这样设置后指纹和请求队列则会一直保存在redis数据库中,默认为False,一般不进行设置

    SCHEDULER_PERSIST = True

    设置重启爬虫时是否清空爬取队列
    这样每次重启爬虫都会清空指纹和请求队列,一般设置为False
    SCHEDULER_FLUSH_ON_START=True

    分布式

    将上述更改后的代码拷贝的各个服务器,当然关于数据库这里可以在每个服务器上都安装数据,也可以共用一个数据,我这里方面是连接的同一个mongodb数据库,当然各个服务器上也不能忘记:
    所有的服务器都要安装scrapy,scrapy_redis,pymongo

    这样运行各个爬虫程序启动后,在redis数据库就可以看到如下内容,dupefilter是指纹队列,requests是请求队列

    项目代码GitHub地址--》分布式爬取知乎

  • 相关阅读:
    LeetCode153 Find Minimum in Rotated Sorted Array. LeetCode162 Find Peak Element
    LeetCode208 Implement Trie (Prefix Tree). LeetCode211 Add and Search Word
    LeetCode172 Factorial Trailing Zeroes. LeetCode258 Add Digits. LeetCode268 Missing Number
    LeetCode191 Number of 1 Bits. LeetCode231 Power of Two. LeetCode342 Power of Four
    LeetCode225 Implement Stack using Queues
    LeetCode150 Evaluate Reverse Polish Notation
    LeetCode125 Valid Palindrome
    LeetCode128 Longest Consecutive Sequence
    LeetCode124 Binary Tree Maximum Path Sum
    LeetCode123 Best Time to Buy and Sell Stock III
  • 原文地址:https://www.cnblogs.com/felixwang2/p/8808895.html
Copyright © 2011-2022 走看看