Python网络爬虫从入门到精通
上QQ阅读APP看书,第一时间看更新

6.2 缓存的应用

在使用Requests-Cache模块实现请求缓存时,只需要调用install_cache()函数即可,其语法格式如下:

     install_cache(cache_name='cache', backend=None, expire_after=None, allowable_codes=(200, ), allowable_methods=
     ('GET', ), session_factory=<class 'requests_cache.core.CachedSession'>, **backend_options)

install_cache()函数中包含了多个参数,每个参数的含义如下。

 cache_name:表示缓存文件的名称,默认值为cache。

 backend:表示设置缓存的存储机制,默认值为None,表示默认使用sqlite进行存储。

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

 allowable_codes:表示设置状态码,默认值为200。

 allowable_methods:表示设置请求方式,默认为GET,表示只有GET请求才可以生成缓存。

 session_factory:表示设置缓存执行的对象,需要实现CachedSession类。

 **backend_options:如果缓存的存储方式为sqlite、mongo、redis数据库,该参数表示设置数据库的连接方式。

【例6.1】 判断是否存在请求缓存。(实例位置:资源包\Code\06\01)

在使用install_cache()函数实现请求缓存时,一般情况下是不需要单独设置任何参数的,只需要使用默认参数即可。判断是否存在缓存的代码如下:

程序运行结果如下:

     是否存在缓存:False
     是否存在缓存:True

【例6.2】 判断是否需要设置延时操作。(实例位置:资源包\Code\06\02)

在发送网络请求爬取网页数据时,如果频繁地发送网络请求,那么后台服务器则会视其为爬虫程序,此时将会采取反爬措施,所以多次请求中要出现一定的间隔时间,设置延时是一个不错的选择。但是,如果在第一次请求后已经生成了缓存,那么第二次请求也就无须设置延时了,对于此类情况,Requests-Cache可以使用自定义钩子函数的方式,合理地判断是否需要设置延时操作。代码如下:

程序运行结果如图6.1所示。

图6.1 例6.2程序运行结果

从图6.1所示的运行结果中可以看出,通过配置钩子函数,可以实现在第一次请求时,因为没有请求缓存,所以执行了2秒等待延时,当第二次请求时,则没有执行2秒延时并输出是否存在请求缓存为True。

说明

Requests-Cache模块支持4种不同的储存机制,分别为memory、sqlite、mongoDB和redis,具体说明如下。

 memory:以字典的形式将缓存存储在内存中,程序运行结束后缓存将被销毁。

 sqlite:将缓存存储在sqlite数据库中。

 mongoDB:将缓存存储在mongoDB数据库中。

 redis:将缓存存储在redis数据库中。

使用Requests-Cache指定缓存不同的存储机制时,只需要为install_cache()函数中backend参数赋值即可,设置方式如下:

在设置存储机制为mongoDB与redis数据库时,需要提前安装对应的操作模块与数据库。安装模块的命令如下:

     pip install pymongo
     pip install redis