7.2 在Requests中使用缓存
Requests-Cache遵循Requests的使用规则:功能强大并使用简单,整个缓存机制由install_cache()方法实现。install_cache()方法定义如下所示:
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已对相关的参数设置了默认值,这些默认值基本能满足日常的开发需求。
使用Requests-Cache之前,首先创建一个简单的网站系统,这是由Flask框架开发的Web系统,主要是方便验证Requests-Cache的缓存功能。我们需要安装Flask框架模块,在CMD窗口下输入pip指令(pip install flask)并等待安装完成。然后创建MyFlask.py文件,并在文件里面编写以下代码:
上述代码创建了一个简单的网站首页,网页内容是“Hello World!”。在PyCharm或CMD窗口下运行MyFlask.py文件即可运行一个简单的Web系统,网站的后台信息如图7-1所示。
图7-1 网站的后台信息
使用浏览器访问图上的地址链接即可看到网站的首页,浏览器每次成功访问网站,都会在网站后台出现相关的请求信息。根据这个规则,使用Requests+Requests-Cache对网站进行两次访问,查看网站后台请求信息的出现次数。如果请求信息只出现一次,说明爬虫缓存正常使用,反之则说明Requests-Cache无法生成缓存。Requests-Cache的使用方法如下所示:
运行上述代码,程序会依次输出False和True, False代表第一次访问还没有生成相关的缓存;True代表第二次访问就已有相关的缓存数据。同时代码所在的文件路径中会生成cache.sqlite文件,这是sqlite数据库文件,用于存储缓存信息。此外,网站后台仅有一条请求信息,如图7-2所示。
图7-2 请求信息
如果短时间内多次访问网站服务器,很容易遭到服务器的拦截,从而认定这些请求是通过爬虫程序执行,而非人为操作,这是反爬虫常见的机制之一。为了降低访问频率,可以在每个请求之间设置一个time.sleep()函数,虽然能降低访问频率,但这样处理就显得不太友好。因为两次请求之间,第一次才是真正访问网站后台,而第二次是直接从数据库读取缓存数据,所以这两次请求之间无需设置延时。
那么如何判断这次请求是否已有缓存,每个请求之间应如何合理地设置延时等待?为此,Requests-Cache可以自定义钩子函数,通过函数去合理判断是否设置延时,函数的定义与使用方法如下:
从函数make_throttle_hook的结构可以看出,这种函数结构其实是一个装饰器的定义过程。也就是说,通过定义装饰器来判断每次请求是否已有缓存数据,从而决定是否设置延时等待。