scrapy_redis原理分析并实现断点续爬以及分布式爬虫

news2024/12/24 7:48:28

scrapy_redis原理分析并实现断点续爬以及分布式爬虫

学习目标
  1. 了解 scrapy实现去重的原理
  2. 了解 scrapy中请求入队的条件
  3. 掌握 scrapy_redis基于url地址的增量式单机爬虫
  4. 掌握 scrapy_redis分布式爬虫

1. 下载github的demo代码

  1. clone github scrapy-redis源码文件

    git clone https://github.com/rolando/scrapy-redis.git

  2. 研究项目自带的demo

    mv scrapy-redis/example-project ~/scrapyredis-project

2. 观察dmoz文件

在domz爬虫文件中,实现方式就是之前的crawlspider类型的爬虫

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule


class DmozSpider(CrawlSpider):
    """Follow categories and extract links."""
    name = 'dmoz'
    allowed_domains = ['dmoztools.net']
    start_urls = ['http://dmoztools.net/'] # 这里修改了url
    
    # 定义数据提取规则,使用了css选择器
    rules = [
        Rule(LinkExtractor(
            restrict_css=('.top-cat', '.sub-cat', '.cat-item')
        ), callback='parse_directory', follow=True),
    ]

    def parse_directory(self, response):
        for div in response.css('.title-and-desc'):
            yield {
                'name': div.css('.site-title::text').extract_first(),
                'description': div.css('.site-descr::text').extract_first().strip(),
                'link': div.css('a::attr(href)').extract_first(),
            }

但是在settings.py中多了以下内容,这几行表示scrapy_redis中重新实现的了去重的类,以及调度器,并且使用RedisPipeline管道类

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True

ITEM_PIPELINES = {
    'example.pipelines.ExamplePipeline': 300,
    'scrapy_redis.pipelines.RedisPipeline': 400,
}

3. 运行dmoz爬虫,观察现象

  1. 首先我们需要添加redis的地址,程序才能够使用redis
REDIS_URL = "redis://127.0.0.1:6379"
#或者使用下面的方式
# REDIS_HOST = "127.0.0.1"
# REDIS_PORT = 6379
  1. 我们执行domz的爬虫,会发现redis中多了一下三个键:

在这里插入图片描述

  1. 中止进程后再次运行dmoz爬虫

继续执行程序,会发现程序在前一次的基础之上继续往后执行,所以domz爬虫是一个基于url地址的增量式的爬虫

4. scrapy_redis的原理分析

我们从settings.py中的三个配置来进行分析
分别是:

  • RedisPipeline # 管道类
  • RFPDupeFilter # 指纹去重类
  • Scheduler # 调度器类
  • SCHEDULER_PERSIST # 是否持久化请求队列和指纹集合

4.1 Scrapy_redis之RedisPipeline

RedisPipeline中观察process_item,进行数据的保存,存入了redis中

在这里插入图片描述

4.2 Scrapy_redis之RFPDupeFilter

RFPDupeFilter 实现了对request对象的加密

在这里插入图片描述

4.3 Scrapy_redis之Scheduler

scrapy_redis调度器的实现了决定什么时候把request对象加入带抓取的队列,同时把请求过的request对象过滤掉

在这里插入图片描述

4.4 由此可以总结出request对象入队的条件

  • request的指纹不在集合中
  • request的dont_filter为True,即不过滤
    • start_urls中的url地址会入队,因为他们默认是不过滤

4.5 实现单机断点续爬

改写网易招聘爬虫,该爬虫就是一个经典的基于url地址的增量式爬虫

5. 实现分布式爬虫

5.1 分析demo中代码

打开example-project项目中的myspider_redis.py文件

通过观察代码:

  1. 继承自父类为RedisSpider
  2. 增加了一个redis_key的键,没有start_urls,因为分布式中,如果每台电脑都请求一次start_url就会重复
  3. 多了__init__方法,该方法不是必须的,可以手动指定allow_domains
  4. 启动方法:
    1. 在每个节点正确的目录下执行scrapy crawl 爬虫名,使该节点的scrapy_redis爬虫程序就位
    2. 在共用的redis中 lpush redis_key 'start_url',使全部节点真正的开始运行
  5. settings.py中关键的配置
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True

ITEM_PIPELINES = {
    'example.pipelines.ExamplePipeline': 300,
    'scrapy_redis.pipelines.RedisPipeline': 400,
}
REDIS_URL = "redis://127.0.0.1:6379"

5.2 动手实现分布式爬虫

改写tencent爬虫为分布式爬虫

注意:启动方式发生改变

小结

  1. scrapy_redis的含义和能够实现的功能

    1. scrapy是框架
    2. scrapy_redis是scrapy的组件
    3. scrapy_redis能够实现断点续爬和分布式爬虫
  2. scrapy_redis流程和实现原理

    1. 在scrapy框架流程的基础上,把存储request对象放到了redis的有序集合中,利用该有序集合实现了请求队列
    2. 并对request对象生成指纹对象,也存储到同一redis的集合中,利用request指纹避免发送重复的请求
  3. request对象进入队列的条件

    1. request的指纹不在集合中
    2. request的dont_filter为True,即不过滤
  4. request指纹的实现

    • 请求方法
    • 排序后的请求地址
    • 排序并处理过的请求体或空字符串
    • 用hashlib.sha1()对以上内容进行加密
  5. scarpy_redis实现增量式爬虫、布式爬虫

    1. 对setting进行如下设置
      • DUPEFILTER_CLASS = “scrapy_redis.dupefilter.RFPDupeFilter”
      • SCHEDULER = “scrapy_redis.scheduler.Scheduler”
      • SCHEDULER_PERSIST = True
      • ITEM_PIPELINES = {‘scrapy_redis.pipelines.RedisPipeline’: 400,}
      • REDIS_URL = “redis://127.0.0.1:6379” # 请正确配置REDIS_URL
    2. 爬虫文件中的爬虫类继承RedisSpider类
    3. 爬虫类中redis_key替代了start_urls
    4. 启动方式不同
      • 通过scrapy crawl spider启动爬虫后,向redis_key放入一个或多个起始url(lpush或rpush都可以),才能够让scrapy_redis爬虫运行
    5. 除了以上差异点以外,scrapy_redis爬虫和scrapy爬虫的使用方法都是一样的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/197299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WPF TotalSummary汇总栏设置鼠标点击事件和显示格式修改

文章目录最开始的提示汇总有两种Summary Panel的设置参考这里Fixed Summary Panel的设置参考这里代码中都用到了DXBinding多个汇总项,对某一项进行控制设置鼠标点击事件整体的xaml代码如下总结最开始的提示 WPF毕竟是微软的东西,且用的人不多&#xff0…

虚函数的复杂(继承)内存布局

文章目录单继承(无虚函数覆盖)单继承(有虚函数覆盖)多继承(无虚函数覆盖)多继承(有虚函数覆盖)菱形继承(有虚函数覆盖)菱形虚拟继承(有虚函数覆盖…

浅析git

目录 git 的历史 git 的感性认识 git 在Linux下的操作 git三板斧 git 的历史 雷纳斯托瓦兹,想必大家对这个名字并不陌生,他是Linux内核的最早作者,随后发起了这个开源项目,担任Linux内核的首要架构师与项目协调者&#xff0c…

Kafka入门(一)

1、Kafka简介 Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域(hadoop集群)、物联网领域。其主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能…

华为路由器Talent服务配置

前言 Telnet:console是通过本地进行设备管理,还有一种是通过远程登录的方式进行设备管理,也就是虚拟终端。通过发送信息进行控制,不受终端和服务器的位置限制(只要可以通信,服务器启用了Telnet功能即可&am…

Python 的基础语法

第一个 Python 程序交互式编程交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编写代码。linux上你只需要在命令行中输入 Python 命令即可启动交互式编程,提示窗口如下:$ pythonPython 2.7.6 (default, Sep 9 2014, 15:04:36)[GCC 4.2…

LinkedHashSet源码阅读理解

概述 1、底层:HashSet LinkedHashMap 2、创建节点时将节点插入链表,因此有序 3、线程不安全 源码理解 demo: public class LinkedHashSetDemo {public static void main(String[] args) {test();}public static void test(){LinkedHas…

CDMP认证考试考前你需要了解的那些事

对国内的数据从业人员来说,CDMP算比较新的考试,目前相关介绍很少,小编整理了CDMP考试先关的一些内容,希望对正在考虑考取CDMP认证的你有所帮助!CDMP认证有几个等级?4个。A级(基础级)…

为什么Google优化排名前期要做长尾关键词?谷歌seo怎么做?

本文主要分享关于谷歌长尾词对于外贸网站获取流量和排名的重要性。 本文由光算创作,有可能会被修改和剽窃,我们佛系对待这种行为吧。 Google优化排名是指在Google 搜索结果中,使外贸站的排名更高。 长尾关键词是指长度较长的,不…

((蓝桥杯 刷题全集)【备战(蓝桥杯)算法竞赛-第2天】( 从头开始重新做题,记录备战竞赛路上的每一道题 )距离蓝桥杯还有65天

🏆🏆🏆🏆🏆🏆🏆 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录&a…

【计算机网络】Linux下路由配置总结

文章目录路由的基础知识Linux内核路由表使用route -n命令查看Linux内核路由表三种路由类型说明(Flags)配置路由route的命令设置包转发静态路由配置参考路由的基础知识 1)路由概念 路由: 跨越从源主机到目标主机的一个互联网络来转发数据包的过程路由器…

多线程代码案例之单例模式

目录 单例模式 饿汉模式 懒汉模式 问题一 问题二 问题三 单例模式 单例模式,是设计模式的一种。在有些特定场景中,有的特定的类,只能创建出一个实例,不应该创建多个实例。单例模式就可以保证这样的需求。例如JDBC中的Data…

OpenMMLab AI实战营笔记前两次课

文章目录1计算机视觉算法基础与 OpenMMLabCV引入OpenMMLab基础知识:2 计算机视觉之图像分类算法基础传统方法--设计图像特征AlexNet VGG 等神经网络搜索(2016)Vision/Swin Transformer轻量化卷积神经网络注意力机制 Attention Mechanism模型学…

文档存储Elasticsearch系列--3分布式存储和搜索过程

前言:ES 作为分布式文档的存储,它的存储过程是怎样的,它的分布式检索过程又是怎样的; 1 分布式存储过程: 为了说明目的, 我们 假设有一个集群由三个节点组成。 它包含一个叫 blogs 的索引,有两个主分片&a…

linux查看/设置某个进程运行的CPU核

目录 1.ps -eF 2.top命令 3.pidstat命令 4.使用taskset指令 5.使用taskset指定进程运行在CPU核 1.ps -eF #查看fwd进程运行在哪个cpu核上 [rootCENTOS57 rpm]# ps -eF | grep fwd 2.top命令 (1)top (2)按f键可以选择下面配置选项 P Last Used Cpu (SMP) (3)Es…

【深度学习】YOLO系列(v1-v3+tinyv3)解析

YOLOv1 正负样本选取 如果目标的中心落在cell中,那么这个cell就负责预测这个类别。 由于每个cell预测两个bbox,那么选择与GT IOU大的bbox来预测这个目标,也就是这一个框的 1 i j o b j = 1 , 1 i j n o b j

通过Python的pptx库操作ppt-替换文本和图片-批量生成任意自定义图片

通过Python的pptx库操作ppt-替换文本和图片-批量生成任意自定义图片 作者:虚坏叔叔 博客:https://xuhss.com 早餐店不会开到晚上,想吃的人早就来了!😄 一、前言 这是一个全部的脚本,我们知道,…

阿里巴巴最全Java、架构师、大数据、算法PPT技术栈图册

我只截图不说话,PPT大全,氛围研发篇、算法篇、大数据、Java后端架构!除了大家熟悉的交易、支付场景外,支撑起阿里双十一交易1682亿元的“超级工程”其实包括以下但不限于客服、搜索、推荐、广告、库存、物流、云计算等。 Java核心…

第二章 Linux系统安装

第一节 安装计划 基本思路是使用VMWare这样的虚拟机软件创建一个“虚拟计算机”,在虚拟机上安装Linux系统。 安装vm软件通过vm软件来创建一个虚拟机空间通过vm软件来在创建好的虚拟空间上,安装我们的Centos操作系统使用Centos 第二节 vmware下载安装 和…

python-实现保留3位有效数字(四舍六入五成双规则)

项目场景: 实现保留3位有效数字(四舍六入五成双规则) 问题描述 输入:输出: 1234 123412 12.04 4.000.2 0.2000.32 0.3201.3 1.301.235 1.241.245 1.241.2451 1.25示例分析: 解决代码: from de…