python爬虫从0到1(第十七天)——scrapy中间件

上一篇文章我们成功的实现了对于scrapy中采集到的数据进行存储,那么今天我们就来对scrapy中的两大常用的中间件进行学习。

一、scrapy中的中间件

以下关于中间件的定义引自百度百科。

**中间件:**介于应用系统和系统软件之间的一类软件,它使用系统软件所提供的基础服务(功能),衔接网络上应用系统的各个部分或不同的应用,能够达到资源共享、功能共享的目的。

从上面稍官方一些的定义来看,如果在计算机方面不太熟悉的人就会很难理解,准确来说是根本看不懂。但是这并不重要,我们通过学习scrapy中的中间件来反向映射去理解上方的定义即可。

1.1 scrapy中间件的分类

scrapy中渐渐可以根据其程序执行流程位置不同分为以下两类:

  1. 下载中间件(介于引擎与下载器之间)
  2. 爬虫中间件(介于引擎与爬虫组件之间)

那么这二者各自的作用又是什么呢?

1.2 scrapy中间件的作用

scrapy的中间件位于同一个middlewares.py文件之中,以两个类的形式呈现。

在这里插入图片描述

其作用(包含但不限于)如下:

  1. 介于请求响应之间处理,例如某个非200的请求可以返回中间件重新构造request对象再重新提交到引擎
  2. 对header、cookie甚至代理IP等进行更换和处理
  3. 域名过滤
  4. 抓取深度与优先级设置
1.3 类中各方法介绍
1.3.1 爬虫中间件
process_spider_input:当爬虫中即将调用某一个回调函数parse_xxx之前,该方法被调用
process_spider_output:当spider处理response返回result,及遇到yield是该方法会被调用
process_spider_exception:当spider出现异常时,该方法被调用
process_start_requests:当爬虫发起请求的时候,该方法被调用
1.3.2 下载中间件
process_request:下载器发起请求前被调用(拦截请求)
process_response:拦截所有的响应
process_exception:拦截出现异常的响应

上述方法的验证可在各个方法中添加print方法来输出查看测试内容的输出顺序,如下方对于process_spider_input(爬虫中间件中)方法的验证:

middlewares.py

在这里插入图片描述

spider01.py

在这里插入图片描述

settings.py中打开中间件

在这里插入图片描述

输出结果

在这里插入图片描述

1.4 在下载中间件中修改代理IP
def process_request(self, request, spider):
    request.meta['proxy'] = 'https://' + 'ip:port'
    return None
def process_exception(self, request, exception, spider):
    request.meta['proxy'] = 'https://' + 'ip:port'
    return request

二、Redis的简单使用

本节内容仅对从未了解过redis的人而准备,熟悉者请跳过。

基本定义:

redis是一个完全开源的非关系型数据库(nosql),也叫作缓存数据库,其保存方式为key—value的形式。

  • redis支持数据的持久化存储,可以将内存中的数据保存在磁盘中,即便是重启系统依然能够再次加载使用

  • 性能高,其写能够达到81000/s,而读更是能够达到11万次/s

  • redis支持字符串(string)、列表(list)、集合(set)、有序集合(zset)、哈希(hash)五大类型

2.1 redis的安装

下载地址:https://github.com/tporadowski/redis/releases

安装成功后将安装目录下的bin文件夹添加到环境变量之中然后再打开终端输入命令redis-cli显示如下证明安装配置成功。

在这里插入图片描述

2.2 redis服务常用命令

卸载服务:redis-server --service-uninstall

开启服务:redis-server --service-start

停止服务:redis-server --service-stop

三、redis常用数据操作

以下命令操作均是连接redis之后进行,结果请自行测试,不再截图演示。

Redis 字符串数据类型的相关命令用于管理 redis 字符串值 {key: value}

3.1 字符串(String)

**keys *** 查看所有的键

127.0.0.1:6379> keys *
(empty list or set)

set key value 设置指定 key 的值

127.0.0.1:6379> set name quanmou
OK

get key 获取指定 key 的值。

127.0.0.1:6379> get name
"quanmou"

setex key seconds value 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。 类似验证码有效期

127.0.0.1:6379> setex name1 5 qm1 # 设置键为name1,过期时间为5秒,值为qm1
OK
127.0.0.1:6379> keys * # 5秒内有name1
1) "name"
2) "name1"
127.0.0.1:6379> keys * # 5秒后查看键,发现没有name1了
1) "name"

mset key1 value1 key2 value2 key3 value3… 保存多条数据,没有按顺序存储

127.0.0.1:6379> mset name1 qm1 name2 qm2 # 多条数据存储
OK
127.0.0.1:6379> keys *
1) "name"
2) "name2"
3) "name1"

mget key1 key2 key3… 获取多个值

127.0.0.1:6379> mget name1 name2
1) "qm1"
2) "qm2"

append key value 添加数据,没有则新增key value,有则在此键的值后面追加数据,类似读写模式里 面w 跟 a 的关系

127.0.0.1:6379> append name3 qm3
(integer) 5
127.0.0.1:6379> keys * # 没有则新增
1) "name"
2) "name3"
3) "name2"
4) "name1"
127.0.0.1:6379> append name3 qm3
(integer) 10
127.0.0.1:6379> get name3 # 有则追加
3.2 哈希

Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对 象。{key:{field:value}}

hset key filed value 将哈希表 key 中的字段 field 的值设为 value

hget key field 获取存储在哈希表中指定字段的值

hmset key field1 value1 [field2 value2 ] 同时将多个 field-value (域-值)对设置到哈希表 key 中。

hmget key field1 [field2]] 获取所有给定字段的值 hkeys key 获取所有哈希表中的字段

hdel key field1 [field2] 删除一个或多个哈希表字段

127.0.0.1:6379> hset qm age 18 # 设置键为qm,字段为age,值为18
(integer) 1
127.0.0.1:6379> hget qm age # 通过键和字段获取值
"18"
127.0.0.1:6379> hmset qm1 hight 160 wight 90
OK
127.0.0.1:6379> hmget qm1 hight wight
1) "160"
2) "90"
127.0.0.1:6379> hkeys qm # 获取key为qm的字段
1) "age"
127.0.0.1:6379> hkeys qm1 # 获取key为qm1的字段
1) "hight"
2) "wight"
127.0.0.1:6379> hdel qm age # 删除键为qm的age字段
(integer) 1
127.0.0.1:6379> hkeys qm
(empty list or set)
127.0.0.1:6379> hdel qm1 hight wight # 删除键为qm1的hight和wight字段
(integer) 2
127.0.0.1:6379> hkeys qm1
(empty list or set)
3.3 列表

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者 尾部(右边)

  • lpush key value1 [value2]] 将一个或多个值插入到列表头部

  • lrange key start stop 获取列表指定范围内的元素,索引从0开始,正数从左往右,负数从右往左

  • rpush key value1 [value2] 在列表中添加一个或多个值 linsert key before|after pivot value 将值 value 插入到列表 key 当中,位于值 pivot 之前或之后

  • lindex key index 通过索引获取列表中的元素

  • lset key index value 通过索引设置列表元素的值

  • lrem key count value 根据参数 count的值,移除列表中与参数 value相等的元素,COUNT 的值可以是以下几种:

    • count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。

    • count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝 对值。

    • count = 0 : 移除表中所有与 VALUE 相等的值。

127.0.0.1:6379> lpush name1 qm1 qm2 qm3 #从头部插入
(integer) 3
127.0.0.1:6379> lrange name1 0 2
1) "qm3"
2) "qm2"
3) "qm1"
127.0.0.1:6379> rpush name2 qm1 qm2 qm3 # 从尾部插入
(integer) 3
127.0.0.1:6379> lrange name2 0 2
1) "qm1"
2) "qm2"
3) "qm3"
127.0.0.1:6379> linsert name2 before qm2 qm4 # 将qm4插入到
qm2的前面
(integer) 4
127.0.0.1:6379> lrange name2 0 2
1) "qm1"
2) "qm4"
3) "qm2"
127.0.0.1:6379> linsert name2 after qm2 qm5 # 将qm5插入到qm2的
后面
(integer) 5
127.0.0.1:6379> lrange name2 0 4
1) "qm1"
2) "qm4"
3) "qm2"
4) "qm5"
5) "qm3"
127.0.0.1:6379> lindex name2 2
"qm2"
127.0.0.1:6379> lset name2 0 qm # 给索引为0的name2设置值为qm
OK
127.0.0.1:6379> lrange name2 0 4
1) "qm"
2) "qm4"
3) "qm2"
4) "qm5"
5) "qm3"
127.0.0.1:6379> lrem name2 2 qm2 # 移除下标为2的qm2的值
(integer) 1
127.0.0.1:6379> rpush name3 qm1 qm2 qm3 qm2 qm4
(integer) 5
127.0.0.1:6379> lrem name3 4 qm2
(integer) 2
127.0.0.1:6379> lrange name3 0 4
1) "qm1"
2) "qm3"
3) "qm4"
3.4 集合

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。 集合对象的编码可以是 intset 或者 hashtable sadd key vakue1[value2] 向集合添加一个或多个成员

smembers key 返回集合中的所有的成员。 不存在的集合 key 被视为空集合。

srem key member1 [member2] 移除集合中一个或多个成员

3.5 有序集合

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小 到大的排序。 有序集合的成员是唯一的,但分数(score)却可以重复。

zadd key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成 员的分数

zrange key start stop 通过索引区间返回有序集合指定区间内的成员

zscore key member 返回有序集中,成员的分数值

zrangebyscore key min max 通过分数返回有序集合指定区间内的成员,注意是闭区间[min,max]

zrem key member [member …]] 移除有序集合中的一个或多个成员

3.6 其他常用命令

exists key 查询特定的键值对,有键则返回为1 ,没有键则返回为 0

type key 查询类型

del key 删除此键值数据

expire key time 给已经存在的数据设置有效期

ttl key 查询有效期

flushall 清空(删除所有数据)

小结:

Redis部分主要是为了下一章节做准备,熟练地话可以不用看,下一篇文章是本专栏基础部分的最后一篇文章,如果在爬虫方面有各种疑惑或者有各种爬虫相关需求的朋友请加群或者直接联系本人。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python网络爬虫框架Scrapy从入门到精通》是一本非常实用的教材,它全面介绍了Scrapy框架的使用方法和技巧,适合各种程度的Python开发者学习和使用。 该书首先从入门级内容开始,介绍了Scrapy的基本概念、安装和配置,以及如何创建一个最简单的爬虫。接着,逐步深入介绍了Scrapy的核心组成部分,包括如何定义Item、编写Spider、使用Pipeline等。通过丰富的示例代码和详细解释,读者可以快速掌握Scrapy的基本用法。 除了基础知识,该书还详细介绍了Scrapy的高级特性和扩展能力。比如,如何处理动态网页、如何利用Scrapy进行数据清洗和处理、如何使用中间件和扩展Scrapy的功能等等。这些内容对于想要进行更复杂网页爬取和数据处理的开发者非常有帮助。 除了框架本身的介绍外,该书还强调了Scrapy开发中的一些实践经验和技巧。比如,如何设计良好的爬虫结构、如何处理反爬虫措施、如何设置合理的请求频率等。这些经验可以帮助开发者更高效地开展爬虫工作,避免一些常见的问题。 总的来说,《Python网络爬虫框架Scrapy从入门到精通》是一本非常实用的教材,能够帮助读者系统学习和掌握Scrapy框架的使用。无论是对于初学者还是有一定经验的开发者,都值得一读。对于想要从事网络爬虫开发的人来说,这本书是一份不可多得的宝藏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

quanmoupy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值