当前位置: 首页 > 后端技术 > Python

反爬虫技术:限制连续请求时间的处理

时间:2023-03-26 17:47:26 Python

一般的反爬虫措施是在多次请求之间增加一个随机间隔,即设置一定的延迟。但如果请求后有缓存,则可以省略设置延迟,一定程度上缩短了爬虫程序的耗时。接下来使用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=at0x11c927f80>,session_factory=,**backend_options,)参数说明如下:-cache_name:缓存文件名。backend:设置缓存的存储机制。默认使用sqlite存储。支持四种不同的存储机制,分别是内存、sqlite、mongoDB、redis。当设置存储机制为mongoDB或redis时,需要提前安装相应的模块。pip安装pymongo;pip安装重做。memory:将缓存以字典的形式存储在内存中,程序运行后会销毁缓存sqlite:将缓存存储在sqlite数据库中mongoDB:将缓存存储在mongoDB数据库中redis:将缓存存储在redis中expire_after:设置缓存的有效时间,默认永久有效。allowable_codes:设置状态代码。allowable_methods:设置请求方式,默认为get,表示只有get请求才能产生缓存。session_factory:设置缓存执行的对象,需要实现CachedSession类。**backend_options:如果缓存的存储方式为sqlit、mongo或redis数据库,该参数表示设置数据库的连接方式。自定义设置缓存示例一:设置缓存文件类型设置缓存文件类型代码如下:delete表示清除缓存requests_cache.install_cache('demo_cache',backend='filesystem')#缓存文件夹会使用系统的临时目录,而不是在代码区创建缓存文件夹。requests_cache.install_cache('demo_cache',backend='filesystem',use_temp=True)#缓存文件夹会使用系统专用的缓存文件夹,而不是在代码区创建缓存文件夹requests_cache.install_cache('demo_cache',backend='filesystem',use_cache_dir=True)#Redis需要安装redis-pypipinstallrediesbackend=requests_cache.RedisCache(host='localhost',port=6379)requests_cache.install_cache('demo_cache',backend=backend)其他区别格式:MongoDB安装pymongopipinstallpymongo;callrequests_cache.MongoCachesaveas'mongodb'gridfsinstallpymongocallrequests_cache.GridFSCachesaveas'gridfs'DynamoDBboto3callrequests_cache.DynamoDbCachesaveas'dynamodb'内存将缓存以字典的形式存储在内存中,之后缓存会被销毁程序运行。调用requests_cache.BaseCache将其保存为“内存”。自定义设置缓存示例2:设置缓存存储的内容。具体示例代码如下:importtimeimportrequestsimportrequests_cache#onlycachepostrequests_cache.install_cache('demo_cache2',allowable_methods=['POST'])#Onlycacherequestswith200returnvaluesrequests_cache.install_cache('demo_cache2',allowable_codes=(200,))只缓存有200个返回值的请求设置缓存的过期时间:#site1.comsite2.com/static的内容会缓存30秒,site2.com/的内容static永远不会过期urls_expire_after={'*.site1.com':30,'site2.com/static':-1}requests_cache.install_cache('demo_cache2',urls_expire_after=urls_expire_after)在响应头中,浏览器会判断是否保存缓存.在设置requests_cache缓存时,可以通过设置cache_control参数来保存浏览器不需要保存的内容#在saveheader中,cache_control设置为不保存requestsrequests_cache.install_cache('demo_cache3',cache_control=True)start=time.time()session=requests.Session()foriinrange(10):session.get('http://httpbin.org/delay/1')print(f'完成{i+1}个请求')end=time.time()print('获取成本时间',end-start)start=time.time()foriinrange(10):session.post('http://httpbin.org/delay/1')print(f'Finished{i+1}requests')end=time.time()print('Costtimeforpost',end-start)在RequestHeaders中添加Cache-Control为no-store,这样即使我们声明了缓存,也不会生效session.get('http://httpbin.org/delay/1',headers={'Cache-Control':'no-store'})觉得Python学习太难?给大家分享一份大佬整理的学习资料。无论是零基础入门,还是想提升自己的Python专业技能,都可以免费获取。关注gzh【Python编程学习圈】,回复【学习资料】,让你的学习更轻松高效!