【愚公系列】《Python网络爬虫从入门到精通》006-请求模块requests高级应用(Requests-Cache)

举报
愚公搬代码 发表于 2025/04/30 23:50:11 2025/04/30
【摘要】 标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主,2024年华为云十佳...
标题 详情
作者简介 愚公搬代码
头衔 华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,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: 如果使用 sqlitemongoredis 存储缓存,这里设置数据库连接的相关参数。

🦋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 种缓存存储机制:

  1. memory: 将缓存存储在内存中,程序结束时缓存会丢失。
  2. sqlite: 使用 SQLite 数据库进行缓存存储。
  3. mongoDB: 将缓存存储在 MongoDB 数据库中。
  4. 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 安装数据库相关模块

如果选择使用 mongoDBredis 作为缓存存储方式,您需要提前安装相关模块:

  • MongoDB:pip install pymongo
  • Redis:pip install redis

🔎5. 总结

  • 安装与测试:通过 pip install requests-cache 安装,使用 requests_cache.__version__ 来确认安装成功。
  • 缓存使用:只需调用 install_cache() 来启用缓存,缓存会自动处理重复请求。
  • 延时操作:通过钩子函数判断缓存是否存在,决定是否添加延时,以避免反爬。
  • 缓存存储机制:支持 4 种存储机制(memorysqlitemongoDBredis)进行缓存存储。

Requests-Cache 模块非常适合用在高频请求场景中,通过缓存机制有效减少网络请求,提高程序效率,同时规避一些反爬虫机制。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。