【愚公系列】《Python网络爬虫从入门到精通》006-请求模块requests高级应用(Requests-Cache)
标题 | 详情 |
---|---|
作者简介 | 愚公搬代码 |
头衔 | 华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。 |
近期荣誉 | 2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主,2024年华为云十佳博主等。 |
博客内容 | .NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。 |
欢迎 | 👍点赞、✍评论、⭐收藏 |
🚀前言
在现代网络编程中,效率和性能是我们必须重视的两个关键因素。尤其是在进行频繁的网络请求时,如何优化请求的速度和减少对服务器的压力显得尤为重要。而requests模块作为Python中最流行的网络请求库,凭借其简单易用的特性,已经赢得了无数开发者的青睐。
今天,我们将聚焦于requests的一个高级应用——Requests-Cache。这个强大的扩展库可以让我们轻松实现请求缓存,显著提高网络请求的效率。无论是在数据抓取、API调用还是日常开发中,利用缓存机制都能有效减少重复请求带来的延迟,提高应用的响应速度。
🚀一、请求模块requests高级应用(Requests-Cache)
Requests-Cache
模块是 requests
模块的一个扩展功能,它为网络请求提供了持久化缓存支持。通过缓存机制,Requests-Cache
能够在发送重复请求时自动判断是否已有缓存数据,如果有,则直接使用缓存数据,避免重复请求服务器。这样不仅减少了不必要的网络请求,还可以规避某些反爬机制。
🔎1. 安装 Requests-Cache
安装 Requests-Cache
模块非常简单,只需在命令行中运行以下命令:
pip install requests-cache
安装完成后,可以通过查看模块的版本来确认安装是否成功:
代码示例:
import requests_cache
# 获取 requests_cache 模块版本
version = requests_cache.__version__
print(f"模块版本为: {version}")
示例输出:
模块版本为: 0.5.2
🔎2. 缓存的使用
🦋2.1 安装缓存
使用 Requests-Cache
时,调用 install_cache()
函数即可启用缓存功能。这个函数包含多个参数,用来控制缓存的行为。常见的参数包括:
-
cache_name: 缓存文件的名称,默认值为 cache
。 -
backend: 设置缓存的存储方式。默认使用 sqlite
存储方式。 -
expire_after: 设置缓存的有效时间,默认是 None
,表示永久有效。 -
allowable_codes: 设置哪些 HTTP 状态码会触发缓存,默认是 200
。 -
allowable_methods: 设置哪些 HTTP 请求方法会触发缓存,默认是 GET
。 -
session_factory: 设置缓存的会话工厂,默认为 requests_cache.core.CachedSession
。 -
backend_options: 如果使用 sqlite
、mongo
或redis
存储缓存,这里设置数据库连接的相关参数。
🦋2.2 示例:判断是否存在请求缓存
import requests_cache # 导入requests_cache模块
import requests # 导入网络请求模块
requests_cache.install_cache() # 设置缓存
requests_cache.clear() # 清理缓存
url = 'http://httpbin.org/get' # 定义测试地址
r = requests.get(url) # 第一次发送网络请求
print('是否存在缓存:',r.from_cache) # False表示不存在缓存
r = requests.get(url) # 第二次发送网络请求
print('是否存在缓存:',r.from_cache) # True表示存在缓存

如上所示,第一次请求时缓存未命中,第二次请求时缓存命中,减少了重复的网络请求。
🔎3. 延时操作
在爬取网页数据时,频繁发送请求可能会被服务器识别为爬虫,进而触发反爬措施。为了避免被屏蔽,可以设置延时操作。但如果请求已经命中缓存,则不需要再次设置延时。Requests-Cache
提供了钩子函数(hook)来动态判断是否需要延时。
🦋3.1 示例:设置延时操作
import requests_cache # 导入requests_cache模块
import time # 导入时间模块
requests_cache.install_cache() # 设置缓存
requests_cache.clear() # 清理缓存
# 定义钩子函数
def make_throttle_hook(timeout=0.1):
def hook(response, *args, **kwargs):
print(response.text) # 打印请求结果
# 判断没有缓存时就添加延时
if not getattr(response, 'from_cache', False):
print('等待',timeout,'秒!')
time.sleep(timeout) # 等待指定时间
else:
print('是否存在请求缓存!',response.from_cache) # 存在缓存输出True
return response
return hook
if __name__ == '__main__':
requests_cache.install_cache() # 创建缓存
requests_cache.clear() # 清理缓存
s = requests_cache.CachedSession() # 创建缓存会话
s.hooks = {'response': make_throttle_hook(2)} # 配置钩子函数
s.get('http://httpbin.org/get') # 模拟发送第一次网络请求
s.get('http://httpbin.org/get') # 模拟发送第二次网络请求

在第一次请求时,因为没有缓存,所以会执行 2 秒的延时;第二次请求时,由于缓存命中,延时操作被跳过。
🔎4. 缓存存储机制
Requests-Cache
支持 4 种缓存存储机制:
-
memory: 将缓存存储在内存中,程序结束时缓存会丢失。 -
sqlite: 使用 SQLite 数据库进行缓存存储。 -
mongoDB: 将缓存存储在 MongoDB 数据库中。 -
redis: 使用 Redis 数据库存储缓存。
🦋4.1 示例:设置缓存存储方式
import requests_cache
# 设置缓存存储机制为内存
requests_cache.install_cache(backend='memory')
# 设置缓存存储机制为 SQLite
requests_cache.install_cache(backend='sqlite')
# 设置缓存存储机制为 MongoDB
requests_cache.install_cache(backend='mongodb')
# 设置缓存存储机制为 Redis
requests_cache.install_cache(backend='redis')
🦋4.2 安装数据库相关模块
如果选择使用 mongoDB
或 redis
作为缓存存储方式,您需要提前安装相关模块:
-
MongoDB: pip install pymongo
-
Redis: pip install redis
🔎5. 总结
-
安装与测试:通过 pip install requests-cache
安装,使用requests_cache.__version__
来确认安装成功。 -
缓存使用:只需调用 install_cache()
来启用缓存,缓存会自动处理重复请求。 -
延时操作:通过钩子函数判断缓存是否存在,决定是否添加延时,以避免反爬。 -
缓存存储机制:支持 4 种存储机制( memory
、sqlite
、mongoDB
、redis
)进行缓存存储。
Requests-Cache
模块非常适合用在高频请求场景中,通过缓存机制有效减少网络请求,提高程序效率,同时规避一些反爬虫机制。
- 点赞
- 收藏
- 关注作者
评论(0)