首页 > 其他分享 >分布式爬虫

分布式爬虫

时间:2022-09-27 23:14:43浏览次数:74  
标签:队列 redis REDIS 爬虫 item scrapy 分布式

一、简介

什么是分布式爬虫?
分布式爬虫就是把一个爬虫任务放到多台机器上去运行,提高爬取效率
但是每台机器运行同一套代码,都在各自的任务和去重队列,等于各爬各的,最终爬的数据是相同的
因此需要提供一个公共的去重队列和公共的任务队列,多台机器都在共用的队列中去调度和去重,然后分别爬取

原来scrapy的Scheduler维护的是本机的任务队列(存放Request对象及其回调函数等信息)+本机的去重队列(存放访问过的url地址)

实现分布式的关键就是三点:
1、共享队列
2、重写Scheduler(调度器),让其无论去重还是任务都访问共享队列
3、为Scheduler定制去重规则(利用redis的集合类型)
以上三点便是scrapy-redis组件的核心功能

二、scrapy-redis实现分布式爬虫

1 scrapy-redis架构

scrapy-redis整体运行流程如下:核心就是把Scheduler(调度器)放到redis当中去

源码位置

2 scrapy-redis共享队列

3 使用scrapy-redis组件

1 pip3 install scrapy-redis 安装

2 原来继承Spider,现在继承RedisSpider
源码spiders.py中,RedisSpider(RedisMixin, Spider)类,继承了原来的Spider,并继承了扩展类RedisMixin

3 不能写start_urls = ['https:/www.cnblogs.com/']  
需要写redis_key = 'myspider:start_urls'  统一管理起始的爬取地址,redis的name对应的是一个列表
放一个起始url,启动爬虫后,返回来的url也是丢到这个列表中,每台机器都是从这个列表中取地址爬取,共享一个队列

class ChoutiSpider(RedisSpider):
    name = 'cnblog'
    allowed_domains = ['cnblogs.com']
    redis_key = 'myspider:start_urls'

4 setting中配置

redis连接
# redis的连接, 默认配置本地+6379
REDIS_HOST = 'localhost'     # 主机名
REDIS_PORT = 6379            # 端口
REDIS_USER =                 # 用户名
REDIS_PASSWORD =             # 密码
REDIS_URL = 'redis://user:pass@hostname:port'       # 支持直接链接
REDIS_PARAMS  = {}                                  # Redis连接参数
REDIS_PARAMS['redis_cls'] = 'myproject.RedisClient' # 指定连接Redis的Python模块
REDIS_ENCODING = "utf-8"                            # redis编码类型 
REDIS_ITEMS_KEY = '%(spider)s:items'                # 将item持久化到redis时,指定的name
REDIS_ITEMS_SERIALIZER = 'json.dumps'               # 将item持久化到redis时,指定序列化函数
重点配置
1、DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"   # 使用scrapy-redis的去重
   源码dupefilter.py中,RFPDupeFilter类重写了request_seen()方法
    def request_seen(self, request):
        fp = self.request_fingerprint(request)
        # self.server是redis连接,sadd表示向集合中add数据
        added = self.server.sadd(self.key, fp)
        return added == 0


2、SCHEDULER = "scrapy_redis.scheduler.Scheduler"    # 使用scrapy-redis的Scheduler, 分布式爬虫的配置

3、持久化配置,配了都走公共的,存在redis中,如果不配,各自存各自的库,当然Mysql也是共用的一个库
ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline': 299} 

源码pipelines.py中,RedisPipeline类,_process_item()方法,就是把item对象转成pickle,再存入redis
    def _process_item(self, item, spider):
        key = self.item_key(item, spider)
        data = self.serialize(item)
        self.server.rpush(key, data)
        return item
其他配置
# 调度器将不重复的任务用pickle序列化后放入共享任务队列,默认使用优先级队列,其他PriorityQueue(有序集合),FifoQueue(列表)、LifoQueue(列表)               
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue' 

# 对保存到redis中的request对象进行序列化,默认使用pickle
SCHEDULER_SERIALIZER = "scrapy_redis.picklecompat"   

# 调度器中请求任务序列化后存放在redis中的name             
SCHEDULER_QUEUE_KEY = '%(spider)s:requests' 

# 去重队列(用的指纹去重,放在集合中),在redis中保存时对应的name                        
SCHEDULER_DUPEFILTER_KEY = '%(spider)s:dupefilter'

# 去调度器中获取数据时,如果为空,最多等待时间(最后没数据,未获取到)。如果没有则立刻返回会造成空循环次数过多,cpu占用率飙升                                
SCHEDULER_IDLE_BEFORE_CLOSE = 10           

# 是否在关闭时候保留原来的调度器和去重记录,True=保留,False=清空                     
SCHEDULER_PERSIST = True       

# 是否在开始之前清空 调度器和去重记录,True=清空,False=不清空                                     
SCHEDULER_FLUSH_ON_START = False    

5 启动scrapy-redis

分布式爬虫部署在三台机器上,等于每台机器启一个爬虫进程,跟在一台机器上启动3个进程本质上一样的
1 进程启动爬虫,启动后要等待从redis中拿出起始url
scrapy crawl cnblog_redis

现在要让爬虫运行起来,需要去redis中以myspider:start_urls为key,插入一个起始地址
cmd命令窗口输入:
2 redis-cil  # 启动redis
3 lpush myspider:start_urls https://www.cnblogs.com/   # 插入起始地址

···

标签:队列,redis,REDIS,爬虫,item,scrapy,分布式
From: https://www.cnblogs.com/cqzlei/p/16736318.html

相关文章

  • HMdubbo1.1【分布式系统中的相关概念】
    1大型互联网项目架构目标1.1传统项目与互联网项目1.2互联网项目特点用户多流量大,并发高海量数据易受攻击功能繁琐变更快1.3衡量网站的性能指......
  • Zookeeper分布式协调服务
    大数据项目最终需要运行在大数据平台之上,而构建Hadoop集群是构建整个大数据平台的核心。Hadoop集群包含HDFS集群和YARN集群,想要构建高可用的Hadoop集群又依赖Zookee......
  • 爬虫理论知识
    常用的请求方法(1)Get(2)Post(3)Put(4)Delete(5)Trace(6)Head(7)Connect(8)Options列举反爬虫机制(1)UA检测;UserAgent:实现UA伪装;Cookie:模拟登陆;Accept:接......
  • 分布式ID详解(5种分布式ID生成方案)
    分布式架构会涉及到分布式全局唯一ID的生成,今天我就来详解分布式全局唯一ID,以及分布式全局唯一ID的实现方案@mikechen什么是分布式系统唯一ID在复杂分布式系统中,往往需......
  • 一小伙使用 python爬虫来算命?
    1.网站分析因版权原因,网站的地址大家可以私信我或者加我文章结尾的qq,完整的教程群里有,需要的自提,当然遇到问题也可以请教哦。2.获取内容我们今天呢,就先做一个通过星座来得......
  • 【Python】网络爬虫
    本章主要讲的是基于Python语言的数据采集,该功能要讲起来可以单独作为一门课程来学习,因为这是一门很重要的课程,一般运用在大数据处理和人工智能上,该应用提供大量的数据。1.......
  • 分布式ID生成方案
    分布式ID策略为什么要用分布式ID?在我们业务数据量不大的时候,单库单表完全可以支撑现有业务,数据再大一点搞个MySQL主从同步读写分离也能对付。但随着数据日渐增长,主从......
  • JAVA中的高并发,解决高并发的方案教程 java分布式解决方案
     java高并发,如何解决,什么方式解一、什么是高并发1.1高并发(HighConcurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时......
  • 爬虫基础——静态网页与动态网页
    爬虫基础——静态网页与动态网页在爬虫前应首先名确待爬取的页面是静态的,还是动态的,只有确定了页面类型,才方便后续对网页进行分析和程序编写。对于不同的网页类型,编写爬......
  • Python爬虫快速入门指南
    笔者近期需要使用爬虫技术来爬取某网页上的数据,因此学习了一下Python爬虫技术,正好最近也在学习Javaweb和spring相关技术,借此过程巩固一下相关基础知识。1了解基础知识①......