前言

一般的反爬措施是在多次请求之间增加随机的间隔时间,即设置一定的延时。但如果请求后存在缓存,就可以省略设置延迟,这样一定程度地缩短了爬虫程序的耗时。

下面利用requests_cache实现模拟浏览器缓存行为来访问网站,具体逻辑如下:存在缓存,就直接走,不存在缓存,就停一下再走

示例代码

用勾子函数根据缓存行为设置访问时间

import requests_cacheimport timerequests_cache.install_cache()  
#默认按照浏览器的缓存进行
requests_cache.clear()
    def make_throttle_hook(timeout=0.1):    
    def hook(response, *args, **kwargs):        
print(response.text)          
# 判断没有缓存时就添加延时       
    if not getattr(response, 'from_cache', False):               
    print(f'Wait {timeout} s!')               
         time.sleep(timeout)       
         else:               
    print(f'exists cache: {response.from_cache}')       
         return response   
         return hookif __name__ == '__main__':    
    requests_cache.install_cache()    
    requests_cache.clear()   
    session = requests_cache.CachedSession() 
# 创建缓存会话    
session.hooks = {'response': make_throttle_hook(2)} 
# 配置钩子函数    
    print('first requests'.center(50,'*'))    
    session.get('http://httpbin.org/get')   
    print('second requests'.center(50,'*'))    
    session.get('http://httpbin.org/get')

有关requests_cache的更多用法,参考下面requests_cache说明

爬虫相关库

1. 爬虫常用的测试网站:httpbin.org

httpbin.org 这个网站能测试 HTTP 请求和响应的各种信息,比如 cookie、ip、headers 和登录验证等,且支持 GET、POST 等多种方法,对 web 开发和测试很有帮助。它用 Python Flask 编写,是一个开源项目。

2. requests-cache

requests-cache,是 requests 库的一个扩展包,利用它可以非常方便地实现请求的缓存,直接得到对应的爬取结果。

作用和使用场景

1.在爬取过程中,它可以根据浏览器的缓存机制来选择缓存内容。从请求行为上看与浏览器更加相似,起到反反爬的效果。

2.另外,还可以自定义缓存机制,在爬虫项目中,优化性能。

requests-cache库只能对requests的请求实现缓存功能,而且requests要以session方式进行请求。单独的requests.get、requests.post 不能被缓存。 

requests

使用方法

安装: 

$ pip install requests-cache

与普通的代码比较

在爬取一个域名下的多个url时,使用requests.session.get或requests.session.post会比单纯的requests.get、requests.post更高效。因为它只建立了一个会话,并在上面做多次请求。同时还支持登录信息cookie等的传递。

下面比较一下缓存代码的写法 没有缓存的代码:

普通的requests session爬取

import requests
import time
start = time.time()
session = requests.Session()
for i in range(10):
    session.get('http://httpbin.org/delay/1')
    print(f'Finished {i   1} requests')
end = time.time()
print('Cost time', end - start)

该代码是访问了httpbin.org网站,该网站会解析delay/1,在1秒后返回。

有缓存的代码:

带缓存的requests session爬取

import requests_cache #pip install requests_cache
import time
start = time.time()
session = requests_cache.CachedSession('demo_cache')
for i in range(10):
    session.get('http://httpbin.org/delay/1')
    print(f'Finished {i   1} requests')
end = time.time()
print('Cost time', end - start)

为原有代码微创式添加缓存功能

只需要添加一句requests_cache.install_cache('demo_cache')即可。

微创式添加缓存功能

import requests_cache #pip install requests_cache
requests_cache.install_cache('demo_cache')#demo_cache.sqlite 做缓存
import requests
import time
start = time.time()
session = requests.Session()
for i in range(10):
    session.get('http://httpbin.org/delay/1')
    print(f'Finished {i   1} requests')
end = time.time()
print('Cost time', end - start)

缓存的清空和识别

如果需要清空缓存,可以调用:requests_cache.clear() # 清空缓存代码

通过res.from_cache可以判断该值是否是缓存值:

import requests_cache
import requests
requests_cache.install_cache() # 设置缓存
requests_cache.clear() # 清空缓存
url = 'http://httpbin.org/get'
res = requests.get(url)
print(f'cache exists: {res.from_cache}')
# cache exists: False # 不存在缓存
res = requests.get(url)
print(f'exists cache: {res.from_cache}')
# exists cache: True # 存在缓存

自定义设置缓存的形式

requests_cache.install_cache默认的方式是与浏览器的缓存行为一致的。如果要自定义可以先了解该函数的参数:

requests_cache.install_cache定义

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

该参数说明如下: - cache_name:缓存文件名称。

  • backend:设置缓存的存储机制,默认使用sqlite进行存储。
    支持四种不同的存储机制,分别为memory、sqlite、mongoDB、redis。在设置存储机制为mongoDB、redis时需要提前安装对应的模块。pip install pymongo; pip install redies。 
  • memory:以字典的形式将缓存存储在内存当中,程序运行完以后缓存将被销毁 
  • sqlite:将缓存存储在sqlite数据库中 
  • mongoDB:将缓存存储在mongoDB数据库中 
  • redis:将缓存存储在redis中 
  • expire_after:设置缓存的有效时间,默认永久有效。 
  • allowable_codes:设置状态码。 
  • allowable_methods:设置请求方式,默认get,表示只有get请求才可以生成缓存。 
  • session_factory:设置缓存执行的对象,需要实现CachedSession类。 
  • **backend_options:如果缓存的存储方式为sqlit、mongo、redis数据库,该参数表示设置数据库的连接方式。

自定义设置缓存的例子1:设置缓存文件类型

设置缓存文件类型的代码如下:

#设置缓存:任选其一
requests_cache.install_cache('demo_cache')#demo_cache.sqlite 做缓存
#demo_cache文件夹做缓存,删除及表示清空缓存
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-py  pip install redies
backend = requests_cache.RedisCache(host='localhost', port=6379)
requests_cache.install_cache('demo_cache', backend=backend)

其他不同格式:

MongoDB 安装pymongo pip install pymongo;

调用requests_cache.MongoCache 保存为’mongodb’

gridfs 安装pymongo

调用requests_cache.GridFSCache 保存为’gridfs’

DynamoDB boto3 调用requests_cache.DynamoDbCache 保存为’dynamodb’ 

Memory 以字典的形式将缓存存储在内存当中,程序运行完以后缓存将被销毁 调用requests_cache.BaseCache 保存为’memory’

自定义设置缓存的例子2:设置缓存保存内容

具体例子代码如下:

import time
import requests
import requests_cache
#只缓存post
requests_cache.install_cache('demo_cache2', allowable_methods=['POST'])
#只缓存200返回值的请求
requests_cache.install_cache('demo_cache2', allowable_codes=(200,))

只缓存200返回值的请求

设置缓存的过期时间:

#site1.com 的内容就会缓存 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)

在响应头中,浏览器会根据cache_control参数来确定是否保存缓存,在设置requests_cache缓存时,可以对cache_control参数设置,使其保存浏览器不需要保存的内容。

# 保存头中,cache_control设为不保存的请求
requests_cache.install_cache('demo_cache3', cache_control=True)
start = time.time()
session = requests.Session()
for i in range(10):
    session.get('http://httpbin.org/delay/1')
    print(f'Finished {i   1} requests')
end = time.time()
print('Cost time for get', end - start)
start = time.time()
for i in range(10):
    session.post('http://httpbin.org/delay/1')
    print(f'Finished {i   1} requests')
end = time.time()
print('Cost time for post', end - start)

在 Request Headers 里面加上了 Cache-Control 为 no-store,这样的话,即使我们声明了缓存那也不会生效

session.get('http://httpbin.org/delay/1',               
    headers={                   
    'Cache-Control': 'no-store'               
    }
)

以上就是python反反爬虫技术限制连续请求时间处理的详细内容,更多关于python反反爬虫连续请求限制的资料请关注Devmax其它相关文章!

python反反爬虫技术限制连续请求时间处理的更多相关文章

  1. XCode 3.2 Ruby和Python模板

    在xcode3.2下,我的ObjectiveCPython/Ruby项目仍然可以打开更新和编译,但是你无法创建新项目.鉴于xcode3.2中缺少ruby和python的所有痕迹(即创建项目并添加新的ruby/python文件),是否有一种简单的方法可以再次安装模板?我发现了一些关于将它们复制到某个文件夹的信息,但我似乎无法让它工作,我怀疑文件夹的位置已经改变为3.2.解决方法3.2中的应用程序模板

  2. Swift基本使用-函数和闭包(三)

    声明函数和其他脚本语言有相似的地方,比较明显的地方是声明函数的关键字swift也出现了Python中的组元,可以通过一个组元返回多个值。传递可变参数,函数以数组的形式获取参数swift中函数可以嵌套,被嵌套的函数可以访问外部函数的变量。可以通过函数的潜逃来重构过长或者太复杂的函数。

  3. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  4. Swift、Go、Julia与R能否挑战 Python 的王者地位

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 红薯因 Swift 重写开源中国失败,貌似欲改用 Python

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  6. 你没看错:Swift可以直接调用Python函数库

    上周Perfect又推出了新一轮服务器端Swift增强函数库:Perfect-Python。对,你没看错,在服务器端Swift其实可以轻松从其他语种的函数库中直接拿来调用,不需要修改任何内容。以如下python脚本为例:Perfect-Python可以用下列方法封装并调用以上函数,您所需要注意的仅仅是其函数名称以及参数。

  7. Swift中的列表解析

    在Swift中完成这个的最简单的方法是什么?我在寻找类似的东西:从Swift2.x开始,有一些与你的Python样式列表解析相当的东西。(在这个意义上,它更像是Python的xrange。如果你想保持集合懒惰一路通过,只是这样说:与Python中的列表解析语法不同,Swift中的这些操作遵循与其他操作相同的语法。

  8. swift抛出终端的python错误

    每当我尝试启动与python相关的swift时,我都会收到错误.我该如何解决?

  9. 在Android上用Java嵌入Python

    解决方法看看this,它适用于J2SE,你可以尝试在Android上运行.

  10. 在android studio中使用python代码构建android应用程序

    我有一些python代码和它的机器人,我正在寻找一种方法来使用android项目中的那些python代码.有没有办法做到这一点!?解决方法有两种主要工具可供使用,它们彼此不同:>QPython>Kivy使用Kivy,大致相同的代码也可以部署到IOS.

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部