Requests-Cache爬虫缓存简介及安装 缓存的存储机制

鳄鱼君

发表文章数:642

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python » Requests-Cache爬虫缓存简介及安装 缓存的存储机制

Requests-Cache的简介

Requests-Cache是Requests模块的一个扩展功能,它是根据Requests的发送请求来生成相应的缓存数据。让Requests重复向同一个URL发送请求的时候,Requests-Cache会判断当前请求是否已产生缓存,若已有缓存,则从缓存里读取数据作为响应内容;若没有缓存,则向网站服务器发送请求,并将得到的响应内容写入相应的数据库里。

Requests-Cache的安装

Requests-Cache的作用非常重要,它可以减少网络资源重复请求的次数,不仅减轻了本地的网络负载,而且还减少了爬虫对网站服务器的请求次数,这也是解决反爬虫机制的一个重要手段。

Requests-Cache的安装可以使用pip命令:pip install requests-cache,非常的简单!

Requests-Cache的使用

Requests-Cache遵循Requests的使用规则:功能强大而且使用简单,整个缓存机制由install_cache()方法实现。我们来看一些具体的参数解释:

● cache_name:默认值为cache,这是对缓存的存储文件进行命名。

● backend:设置缓存的存储机制,默认值为None,即默认sqlite数据库存储。

● expire_after:设置缓存的有效时间,默认值None,即为永久有效。

● allowable_codes:设置HTTP的状态码,默认值为200。

● allowable_methods:设置请求方式,默认值是只允许GET请求才能生成缓存。

● session_factory:设置缓存的执行对象,由CachedSession类实现,该类是由Requests-Cache定义。

● **backend_options:设置存储配置,若缓存的存储选择sqlite、redis或mongoDB数据库,则该参数是设置数据库的连接方式。

在实际应用中,install_cache()可以直接使用,无需设置任何参数,因为Requests-Cache已对相关的参数设置了默认值,这些默认值基本能满足日常的开发需求。

为了更好的看到缓存效果,可以自建一个服务端,这里使用Flask框架。前提是你已经通过pip命令安装好flask框架:pip install flask。然后创建MyFlask.py文件,并在文件里面编写以下代码:

from flask import Flask
# 创建一个Falsk实例
app=Flask(__name__)

# 设置路由URL
@app.route('/')
def index():
    #返回Hello World!
    return "Hello World!"
if __name__ == '__main__':
    app.run()

上述代码创建了一个简单的网站首页,网页内容是“Hello World!”。运行MyFlask.py文件即可运行一个简单的Web系统,访问控制台的URL并返回控制台,可以看到在控制台会输出以下信息:

Requests-Cache爬虫缓存简介及安装 缓存的存储机制

浏览器每次成功访问网站,都会在网站后台出现相关的请求信息。根据这个规则,使用Requests+Requests-Cache对网站进行两次访问,查看网站后台请求信息的出现次数。如果请求信息只出现一次,说明爬虫缓存正常使用,反之则说明Requests-Cache无法生成缓存。Requests-Cache的使用方法参考:

import requests
import requests_cache

# 使用requests_cache()方法
requests_cache.install_cache()
#清除已有缓存
requests_cache.clear()
# 访问自定义Web服务
url='http://127.0.0.1:5000/'
# 创建session会话
session=requests.session()
# 访问两次
for _ in range(2):
    res=session.get(url)
    # from_cache是requests-cache的函数
    # 若输出True,表示生成缓存
    print(res.from_cache)

运行上述代码,程序会依次输出False和True, False代表第一次访问还没有生成相关的缓存;True代表第二次访问就已有相关的缓存数据。同时代码所在的文件路径中会生成cache.sqlite文件,这是sqlite数据库文件,用于存储缓存信息。此外,网站后台仅有一条请求信息:

Requests-Cache爬虫缓存简介及安装 缓存的存储机制

如果短时间内多次访问网站服务器,很容易遭到服务器的拦截,从而认定这些请求是通过爬虫程序执行,而非人为操作,这是反爬虫常见的机制之一。为了降低访问频率,可以在每个请求之间设置一个time.sleep()函数,虽然能降低访问频率,但这样处理就显得不太友好。因为两次请求之间,第一次才是真正访问网站后台,而第二次是直接从数据库读取缓存数据,这样对于第二次请求就无需设置时间间隔。

Requests-Cache可以自定义钩子函数,通过函数去合理判断是否设置延时,函数的定义与使用方法如下:

import requests_cache
import time
# 定义钩子函数
def make_hook(delay=1.0):
    def hook(response,*args,**kwargs):
        # 如果没有缓存,则添加延时
        if not getattr(response,'from_cache',False):
            print('delayTime')
            time.sleep(delay)
        return response
    return hook
if __name__ == '__main__':
    requests_cache.install_cache()
    requests_cache.clear()
    # 钩子函数的使用
    res=requests_cache.CachedSession()
    res.hooks={'response':make_hook(2)}
    res.get('http://127.0.0.1:5000/')
    res.get('http://127.0.0.1:5000/')

函数make_hook非常像装饰器,也就是说,通过定义装饰器来判断每次请求是否已有缓存数据,从而决定是否设置延时等待,具体的效果自己尝试!

缓存的存储机制

Requests-Cache支持sqlite(默认)redismongoDB数据库存储缓存信息,此外,还可以将缓存存储在计算机的内存中。也就是说Requests-Cache支持4种不同的存储机制:memory、sqlite、redis和mongoDB,4种存储机制说明如下:

● memory:每次程序运行都会将缓存以字典的形式保存在内存中,程序运行完毕,缓存也随之销毁。

● sqlite:将缓存存储在sqlite数据库,这是Requests-Cache默认的存储机制。

● redis:将缓存存储在redis数据库,通过redis模块实现数据库的读写。

● mongoDB:将缓存存储在mongoDB数据库,通过pymongo模块实现数据库的读写。

在Requests-Cache设置不同的存储机制只需对install_cache()方法的参数backend进行设置即可,具体设置如下:

import requests_cache
# 设置memory存储
requests_cache.install_cache(backend='memory')
# 设置sqlite存储
requests_cache.install_cache(backend='sqlite')
# 设置redis存储
requests_cache.install_cache(backend='redis')
# 设置mongo存储
requests_cache.install_cache(backend='mongo')

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《Requests-Cache爬虫缓存简介及安装 缓存的存储机制》 发布于2020-05-29

分享到:
赞(0) 赏杯咖啡

评论 抢沙发

6 + 9 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册