爬虫---scrapy-redis

Scrapy-Redis 是一个结合 Redis 实现的 Scrapy 分布式爬虫框架,提供 Scheduler、Duplication Filter 等组件,支持分布式、去重、持久化和增量爬取。Redis 的内存数据库特性提高了请求和数据处理效率。Scrapy-Redis 通过三种不同类型的爬虫类适用于不同场景,如增量爬虫、分布式抓取和深度爬虫。数据直接存储在 Redis 中,分布式设置涉及 USER_AGENT、DUPEFILTER_CLASS、SCHEDULER 和 PIPELINES 的配置。
摘要由CSDN通过智能技术生成

scrapy redis 简介

Scrapy-redis 是为了更方便地实现 Scrapy 分布式爬取,而提供了一些以 redis 为基础的
组件(仅有组件)。主体还是是 redis 和 scrapy 两个库,Scrapy-redis 像胶水一样,把这
两个插件粘结了起来。
特点:
        能实现分布式爬取
        可实现去重
        持续性爬取,可实现增量式爬虫
        遵守 Rule 规则,可以实现深度爬虫

为什么选择redis数据库:

redis支持主从同步,而且数据都是缓存在内存中,所以基于redis的分布式爬虫,对请求和数据的高频读取效率非常高。

Redis 是一个开源的,内存数据库,它可以用作数据库、缓存和消息中间件。

它支持多种类型的数据结构:字符串,哈希,列表,集合,有序集合等

scrapy和scrapy-redis区别:

1.scrapy-redis 在 scrapy 的架构上增加了 redis

2.请求url放在set,生成指纹放在scrapy-redis里面

3.scrapy自己存储,scrapy-redis自动存储

4.Scrapy 本身不支持爬虫分布式,多个 spider 不能共享待爬取队列 Scrapy queue,

scrapy-redis 把 Scrapy queue 换成 redis 数据库,用同一个 redis-server 存放要爬
取的 request,便能让多个 spider 去同一个数据库里读取  

基于 redis 的特性拓展了如下组件: 

1. Scheduler
Scheduler 负责对新的 request 进行入列和出列的操作。
Scrapy 本身不支持爬虫分布式,多个 spider 不能共享待爬取队列 Scrapy queue,
scrapy-redis 把 Scrapy queue 换成 redis 数据库,用同一个 redis-server 存放要爬
取的 request,便能让多个 spider 去同一个数据库里读取。

2.Duplication Filter
Duplication Filter 利用了 redis 的 set 不重复的特性实现去重
scrapy-redis 调度器从引擎接受 request,将 request 的指纹存⼊redis 的 set 检查是否重
复,并将不重复的 request push 写⼊redis 的 request queue。

引擎请求 request(Spider 发出的)时,调度器从 redis 的 request queue 队列⾥里根据优
先级 pop 出⼀个 request 返回给引擎,引擎将此 request 发给 spider 处理。
3.Item Pipeline
引擎将爬取到的 Item 传给 Item Pipeline,scrapy-redis 的 Item Pipeline 将爬取到的
Item 存⼊redis 的 items queue。
4.Base Spider
不在使用 scrapy 原有的 Spider 类,重写的 RedisSpider 继承了 Spider 和 RedisMixin 这
两个类,RedisMixin 是用来从 redis 读取 url 的类。
当我们生成一个 Spider 继承 RedisSpider 时,调用 setup_redis 函数,这个函数会去连接
redis 数据库,然后会设置 signals(信号):
一 个 是 当 spider 空 闲 时 候 的 signal , 会 调 用 spider_idle 函 数 , 这 个 函 数 调 用
schedule_next_request 函数,保证 spider 是一直活着的状态,并且抛出 DontCloseSpider
异常。
一个是当抓到一个 item 时的 signal,会调用 item_scraped 函数,这个函数会调用
schedule_next_request 函数,获取下一个 request。

三种爬虫类,针对不同的应用场景

第一种:应用场景:只做增量式爬虫

1、dmoz (class DmozSpider(CrawlSpider))

特点

         继承的是 CrawlSpider

         需要设置 Rule 规则,以及 callback 不能写 parse()方法。

         它是用来说明 Redis 的持续性,可实现增量式爬虫当我们第一次运行 dmoz 爬虫,然后 Ctrl + C 停掉之后,再运行              dmoz 爬虫,之前的爬取记录是保留在 Redis 里的。

2、myspider_redis (class MySpider(RedisSpider))
特点
         继承了 RedisSpider, 支持分布式抓取
         需要写 parse 函数。
         不需要写 start_urls 了,取而代之指定 redis_key,scrapy-redis 将 key 从 Redis 里
             pop 出来,成为请求的 url 地址。
         根据指定的格式,start_urls 将在 Master 端的 redis-cli 里 lpush 到 Redis 数据
           库里,RedisSpider 将在数据库里获取 start_urls。
           参考格式:redis_key = 'myspider:start_urls'
        不需要写 allowd_domains

执行方式
 通过 runspider 方法执行爬虫的 py 文件(也可以分次执行多条),爬虫(们)将处于
等待准备状态:
scrapy runspider myspider_redis.py
 在 Master 端的 redis-cli 输入 push 指令,参考格式:
$redis > lpush myspider:start_urls http://dmoztools.net/
Slaver 端爬虫获取到请求,开始爬取。

3、mycrawler_redis (class MyCrawler(RedisCrawlSpider))
特点
        爬虫继承了 RedisCrawlSpider
        能够支持分布式的抓取
        因为采用的是 crawlSpider,所以需要遵守 Rule 规则,可以实现深度爬虫
        callback 不能设为 parse()方法。
        不需要写 start_urls 了,取而代之的是 redis_key
        scrapy-redis 将 key 从 Redis 里 pop 出来,成为请求的 url 地址。
            源码 mycrawler_redis.py

执行方式
 通过 runspider 方法执行爬虫的 py 文件(也可以分次执行多条),爬虫(们)将处于
等待准备状态:
scrapy runspider mycrawler_redis.py
 在 Master 端的 redis-cli 输入 push 指令,参考格式:
$redis > lpush mycrawler:start_urls http://www.dmoz.org/
爬虫获取 url,开始执行

数据存储:

items 数据直接存储在 Redis 数据库中,这个功能已经由 scrapy-redis 自行实现。除非
单独做额外处理(比如直接存入本地数据库等),否则不用编写 pipelines.py 代码。 

分布式设置:

USER_AGENT 设置

USER_AGENT = 'scrapy-redis (+https://github.com/rolando/scrapy-redis)'

去重过滤器的组件:

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

调度器的组件:
SCHEDULER = "scrapy_redis.scheduler.Scheduler"

持续化存储的:
SCHEDULER_PERSIST = True

PIPELINES 存储设置:

ITEM_PIPELINES = {
    'example.pipelines.ExamplePipeline': 300,

   课件上的直接拷贝过来,不修改特别是k
    'scrapy_redis.pipelines.RedisPipeline': 400,
}

延迟一秒:
DOWNLOAD_DELAY = 1

数据库设置:

实际的改为ip
#REDIS_HOST='192.168.10.132'

主机,说明redis在本机,分布式以后不在主机上再修改
REDIS_HOST='127.0.0.1'

端口
REDIS_PORT=6379

密码:需要做验证
REDIS_PARAMS = {
    'password': '123',
}

Log 设置:
LOG_LEVEL = 'DEBUG'

编码:
REDIS_ENCODING = "utf-8" # redis 编码类型默认:'utf-8'

 增量抓虫:

指在具有一定量规模的网络页面集合的基础上,采用更新数据的方式选取已有集
合中的过时网页进行抓取,以保证所抓取到的数据与真实网络数据足够接近。进行增量式抓
取的前提是,系统已经抓取了足够数量的网络页面,并具有这些页面被抓取的时间信息。

深度爬虫:

针对起始 url 地址进行数据采集,在响应数据中进行数据筛选得到需要进行数据
采集的下一波 url 地址,并将 url 地址添加到数据采集队列中进行二次爬取..以此类推,一致
到所有页面的数据全部采集完成即可完成深度数据采集,这里的深度指的就是 url 地址的检
索深度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值