scrapy_redis实现增量式爬虫

本文深入解析Scrapy-Redis组件,探讨其如何在Scrapy框架上实现请求对象持久化、去重持久化及分布式爬虫功能。通过分析Scrapy-Redis的关键组件如RedisPipeline、RFPDupeFilter和Scheduler,揭示增量式爬虫的实现机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目标

  1. 了解scarpy_redis的概念和功能
  2. 了解scrapy_redis的实现流程
  3. 掌握scrapy_redis增量式爬虫的实现方法

1 scrapy_redis是什么

Scrapy_redis : Redis-based components for Scrapy.

Github地址:https://github.com/rmax/scrapy-redis

在这个地址中存在三个demo,后续我们对scrapy_redis的学习会通过这三个demo展开

2 为什么要学习scrapy_redis

Scrapy_redis在scrapy的基础上实现了更多,更强大的功能,具体体现在:

  • 请求对象的持久化
  • 去重的持久化
  • 和实现分布式

3 scrapy_redis的原理分析

3.1 回顾scrapy的流程

那么,在这个基础上,如果需要实现分布式,即多台服务器同时完成一个爬虫,需要怎么做呢?

3.2 scrapy_redis的流程

  • 在scrapy_redis中,所有的带抓取的对象和去重的指纹都存在所有的服务器公用的redis中

  • 所有的服务器公用一个redis中的request对象

  • 所有的request对象存入redis前,都会在同一个redis中进行判断,之前是否已经存入过

  • 在默认情况下所有的数据会保存在redis中

具体流程如下:

4 对于redis的复习

4.1 redis是什么

redis是一个开源的内存型数据库,支持多种数据类型和结构,比如列表、集合、有序集合等

4.2 redis服务端和客户端的启动

  • /etc/init.d/redis-server start 启动服务端
  • redis-cli -h <hostname> -p <端口号> 客户端启动

4.3 redis中的常见命令

  1. select 1 切换db
  2. keys * 查看所有的键
  3. tyep 键 查看键的类型
  4. flushdb 清空db
  5. flushall 清空数据库

4.4 redis命令的复习

redis的命令很多,这里我们简单复习后续会使用的命令

5 scrapy_redis domz爬虫 分析

5.1 拷贝源码中的demo文件

1、clone github scrapy-redis源码文件 git clone https://github.com/rolando/scrapy-redis.git 

2、研究项目自带的三个demo mv scrapy-redis/example-project ~/scrapyredis-project

5.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/']

    # 定义数据提取规则,使用了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,
}

5.3 运行dmoz爬虫,观察现象

  1. 首先我们需要添加redis的地址,程序才能够使用redis

     REDIS_URL = "redis://127.0.0.1:6379"
     #或者使用下面的方式
     # REDIS_HOST = "127.0.0.1"
     # REDIS_PORT = 6379
    
  2. 我们执行domz的爬虫,会发现redis中多了一下三个键:

  3. 继续执行程序

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

6. scrapy_redis的原理分析

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

  • RedisPipeline
  • RFPDupeFilter
  • Scheduler

6.1 Scrapy_redis之RedisPipeline

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

6.2 Scrapy_redis之RFPDupeFilter

RFPDupeFilter 实现了对request对象的加密

6.3 Scrapy_redis之Scheduler

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

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

  • request之前没有见过
  • request的dont_filter为True,即不过滤
  • start_urls中的url地址会入队,因为他们默认是不过滤

7. 动手

  • 需求:抓取京东图书的信息
  • 目标:抓取京东图书包含图书的名字、封面图片地址、图书url地址、作者、出版社、出版时间、价格、图书所属大分类、图书所属小的分类、分类的url地址
  • url:https://book.jd.com/booksort.html

思路分析:

  1. 确定数据抓取的入口

    数据都在dl下的dt和dd中,其中dt是大分类的标签,dd是小分类的标签

    对应的思路可以使选择所有的大分类后,选择他下一个兄弟节点即可

    xpath中下一个兄弟节点的语法是following-sibling::*[1]

  2. 确定列表页的url地址和程序终止的条件

    有下一页

    没有下一页

  3. 确定数据的位置

    数据大部分都在url地址的响应中,但是价格不在

    通过search all file的方法,找到价格的地址,

    对url地址进行删除无用的参数和url解码之后,获取到价格的url为

    https://p.3.cn/prices/mgets?skuIds=J_11635586613

    其中skuId为商品的id,能够在网页中获取

  4. 使用scrapy的思路完成爬虫,在settings中添加上scrapy_redis的配置

Scrapy-Redis框架的介绍与应用 摘要: Scrapy-Redis框架是Scrapy爬虫框架的一个扩展,它使用Redis数据库作为Scrapy的调度器和数据存储。本文介绍了Scrapy-Redis框架的基本原理、架构和应用,详细阐述了其在分布式爬虫、数据存储和增量式爬虫等方面的优势,并通过实例说明了如何使用Scrapy-Redis框架进行爬虫开发。 关键词:Scrapy-Redis分布式爬虫,数据存储,增量式爬虫 一、Scrapy-Redis框架的介绍 Scrapy-Redis框架是Scrapy爬虫框架的一个扩展,它使用Redis数据库作为Scrapy的调度器和数据存储。Scrapy-Redis框架可以在分布式环境下运行,使多台服务器能够同时进行爬取任务,大大提高了爬取效率。此外,Scrapy-Redis框架还支持增量式爬虫,可以根据之前爬取的结果来更新数据,避免重复爬取。 Scrapy-Redis框架主要包含以下组件: 1. Scrapy-Redis调度器 Scrapy-Redis调度器使用Redis的list数据结构实现,每个爬虫任务对应一个Redis列表,爬虫任务被分为多个URL请求,每个请求对应一个Redis列表元素。Scrapy-Redis调度器通过阻塞读取Redis列表来获取待爬取的URL,保证多个爬虫任务之间的URL请求不会重复。 2. Scrapy-Redis去重器 Scrapy-Redis去重器使用Redis的set数据结构实现,对每个爬虫任务的URL进行去重。Scrapy-Redis去重器可以避免重复爬取相同的URL,提高爬取效率。 3. Scrapy-Redis管道 Scrapy-Redis管道使用Redis的hash数据结构实现,将爬取的数据存储到Redis中。Scrapy-Redis管道支持多种数据格式,如json、xml、csv等,可以灵活处理不同类型的数据。 二、Scrapy-Redis框架的应用 1. 分布式爬虫 Scrapy-Redis框架使用Redis作为调度器和数据存储,可以很容易地实现分布式爬虫。多台服务器可以同时运行Scrapy-Redis爬虫,通过Redis列表来共享URL请求和爬取结果。此外,Scrapy-Redis还提供了分布式锁机制,保证多个爬虫任务之间的URL请求不会重复,避免数据重复爬取。 2. 数据存储 Scrapy-Redis框架可以将爬取的数据存储到Redis
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值