一般的反爬虫措施是在多次请求之间增加一个随机间隔,即设置一定的延迟。但如果请求后有缓存,则可以省略设置延迟,一定程度上缩短了爬虫程序的耗时。接下来使用requests_cache模拟浏览器缓存行为来访问网站。具体逻辑如下:如果有缓存,直接走;如果没有缓存,就停下来再走。()#defaultrequests_cache.clear()根据浏览器缓存ifnotgetattr(response,'from_cache',False):print(f'Wait{timeout}s!')time.sleep(timeout)else:print(f'existscache:{response.from_cache}')returnresponsereturnhookif__name__=='__main__':requests_cache.install_cache()requests_cache.clear()session=requests_cache.CachedSession()#创建缓存会话session.hooks={'response':make_throttle_hook(2)}#配置钩子函数print('firstrequests'.center(50,'*'))session.get('http://httpbin.org/get')print('secondrequests'.center(50,'*'))session.get('http://httpbin.org/get')requests_cache的更多用法可以参考下面的requests_缓存描述爬虫相关库1.爬虫常用的测试网站:httpbin.orghttpbin.org该网站可以测试HTTP请求和响应的各种信息,如cookies、ip、headers和登录认证等,并支持GET、POST等方法,对web开发和测试有用。它是用Python+Flask编写的,是一个开源项目。2.requests-cacherequests-cache是??requests库的一个扩??展包,可以用来轻松实现对请求的缓存,直接获取对应的爬取结果。功能及使用场景1、在抓取过程中,可以根据浏览器的缓存机制选择缓存的内容。从请求行为来看,更类似于浏览器,具有防爬的作用。2.另外,在爬虫项目中还可以自定义缓存机制来优化性能。requests-cache库只能实现对请求的缓存功能,请求应该以session方式请求。个别requests.get,requests.post不能缓存。如何安装requests:$pipinstallrequests-cache与普通代码相比在爬取一个域名下的多个url时,使用requests.session.get或requests.session.post会比单纯的requests.get,requests.发帖效率更高。因为它只是建立一个会话并在其上进行多个请求。同时还支持传输登录信息cookies等。下面对比一下缓存代码的写法没有缓存的代码:普通请求session爬取importrequestimporttimestart=time.time()session=requests.Session()foriinrange(10):session.get('http:///httpbin.org/delay/1')print(f'完成{i+1}个请求')end=time.time()print('花费时间',end-start)这段代码是访问httpbin.org网站,网站会解析delay/1,1秒后返回。带缓存的代码:带缓存爬取的请求会话importrequests_cache#pipinstallrequests_cacheimporttimestart=time.time()session=requests_cache.CachedSession('demo_cache')foriinrange(10):session.get('http://httpbin.org/delay/1')print(f'Finished{i+1}requests')end=time.time()print('Costtime',end-start)是对原代码微创添加缓存函数只需要添加一个request_cache.install_cache('demo_cache')。微创添加缓存函数importrequests_cache#pipinstallrequests_cacherequests_cache.install_cache('demo_cache')#demo_cache.sqlitedocacheimportrequestsimporttimestart=time.time()session=requests.Session()foriinrange(10):session。get('http://httpbin.org/delay/1')print(f'Finished{i+1}requests')end=time.time()print('Costtime',end-start)缓存空和识别如果需要清除缓存,可以调用:requests_cache.clear()#清除缓存代码可以通过res.from_cache判断该值是否为缓存值:importrequests_cacheimportrequestsrequests_cache.install_cache()#设置缓存requests_cache.clear()#清除缓存url='http://httpbin.org/get'res=requests.get(url)print(f'cacheexists:{res.from_cache}')#cacheexists:False#doesnotexistscacheres=requests.get(url)print(f'existscache:{res.from_cache}')#existscache:True#existscache自定义设置cacheformrequests_cache.install_cache默认满足hod与浏览器的缓存行为一致。如果要自定义,可以先了解一下这个函数的参数:requests_cache.install_cache定义了requests_cache.install_cache(cache_name='cache',backend=None,expire_after=None,allowable_codes=(200,),allowable_methods=('GET',),filter_fn=
