Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >反爬虫策略手把手教你使用FastAPI来限制接口的访问速率

反爬虫策略手把手教你使用FastAPI来限制接口的访问速率

作者头像
Python进阶者
发布于 2021-01-05 15:27:54
发布于 2021-01-05 15:27:54
3.4K00
代码可运行
举报
运行总次数:0
代码可运行

在网络爬虫的过程中,我们都会遇到各种各样的反爬虫,封禁IP和账号,设置验证码,前端加密,浏览器指纹,甚至输出假数据来等等都是可能出现的反爬手段,这些我们今天一个也不会谈及,而是谈谈一种叫访问速率限制的手段。

对于服务端而言,有时候会碰到这么一个场景:某个接口需要在某个时间段内设置最高的访问次数来降低服务器的压力,比如之前用的某度的一些接口,一分钟内访问次数过高就会返回失败,等上个2分钟就又可以返回了。目的就是为了防止开发人员或者爬虫,甚至是恶意请求对服务器无限制的访问,降低服务器开支,因为一般的用户的请求是不会这么频繁的

Ratelimiter

python 中使用 Ratelimiter 来限制某方法的调用次数,用法如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import time
from ratelimiter import RateLimiter

def limited(until):
    duration = int(round(until - time.time()))
    print('Rate limited, sleeping for {:d} seconds'.format(duration))
# 3秒之内只能访问2次
rate_limiter = RateLimiter(max_calls=2, period=3, callback=limited)

for i in range(3):
    with rate_limiter:
        print('Iteration', i)

输出结果如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Iteration 0
Iteration 1
Rate limited, sleeping for 3 seconds
Iteration 2

看到程序如期打印, callback 指定了超出指定次数是回调方法

达到了预期的要求

asyncio 异步中的使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import asyncio
import time

from ratelimiter import RateLimiter

async def limited(until):
    duration = int(round(until - time.time()))
    print('Rate limited, sleeping for {:d} seconds'.format(duration))

async def coro():
    rate_limiter = RateLimiter(max_calls=2, period=3, callback=limited)
    for i in range(3):
        async with rate_limiter:
            print('Iteration', i)

loop = asyncio.get_event_loop()
loop.run_until_complete(coro())

执行结果是一致的, 在一般的 python 方法里面用 Ratelimiter 是没有问题的

Slowapi

对于网络请求的访问速率限制,我建议使用 Slowapi 库,Slowapi相对灵活易用,不必考虑更多的因素。在 fastapi 和 flask 中使用也是得心应手,当然flask框架也有第三方扩展,这个自不必说,django也有自带的限制访问速率的库,而 fastapi 相对比较新,扩展库相对匮乏,在一个偶然的机会看到 Slowapi 的源码, 这是一个非常不错的选择,如果有机会,我会把它封装成 fastapi 框架的另一个插件,继成更多的功能,名字可以是 fastapi-slowapi 之类的

来看看具体的用法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*
# @Time : 2020/11/11 11:09
from fastapi import FastAPI
from slowapi import Limiter, _rate_limit_exceeded_handler
from slowapi.errors import RateLimitExceeded
from slowapi.util import get_remote_address

# 初始化 slowapi,注册进 fastapi
limiter = Limiter(key_func=get_remote_address)
FastAPI().state.limiter = limiter
FastAPI().add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)

具体调用方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding: utf-8 -*
# @Time : 2020/11/11 11:09

# 一小时内只能调用该接口 4 次
@limiter.limit("4/hour")
async def startSpider(*, request: Request, d_obj: dict):
    if request.method == "POST":
        statusDict = get_spider_status(shopId=d_obj.get("shopId"))
        if not statusDict.get("data"):
            return resp_422(message='程序正在抓取中,请勿重复调度')
        try:
            result = all_run(d_obj.get("shopId"))
            return result
        except:
            return resp_401()
    return "这是一个GET请求"

这是我写的一个用于限制爬虫调度的一个方法,如果这个爬虫接口一小时中调度超过 4 次就返回调度超过指定次数的结果,当然代码中的 hour 也可以是 minute 或者 second,使用相对简单,大家可以一试并自行扩展

具体作用就是为了限制某接口在单位时间内被调用的次数,对于后端开发者来说可以减少对服务器的访问压力,而对于爬虫工程师而言,这也是从某种程度上保护我方数据的一种策略。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python爬虫与数据挖掘 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
FastAPI 接口限流
如果没有接口限流,可能会导致服务器负载不平衡,暴力破解密码,恶意请请求,导致服务器额外费用,拒绝服务攻击等。
somenzz
2022/05/24
1.2K0
关于asyncio知识(一)
asyncio 是python3.4 引入的一个新的并发模块,主要通过使用coroutines 和 futures 来让我们更容易的去实现异步的功能,并且几乎和写同步代码一样的写代码,还没有烦人的回调。
coders
2019/05/25
9620
关于asyncio知识(二)
通过上一篇关于asyncio的整体介绍,看过之后基本对asyncio就有一个基本认识,如果是感兴趣的小伙伴相信也会尝试写一些小代码尝试用了,那么这篇文章会通过一个简单的爬虫程序,从简单到复杂,一点一点的改进程序以达到我们想要的效果.
coders
2019/05/25
1.3K0
Python 异步爬虫原理解析及爬取实战
爬虫是 IO 密集型任务,比如我们使用 requests 库来爬取某个站点的话,发出一个请求之后,程序必须要等待网站返回响应之后才能接着运行,而在等待响应的过程中,整个爬虫程序是一直在等待的,实际上没有做任何的事情。
叶庭云
2022/05/08
8260
Python  异步爬虫原理解析及爬取实战
Python爬虫学习笔记 asyncio+aiohttp 异步爬虫原理和解析
爬虫是 IO 密集型任务,比如如果我们使用 requests 库来爬取某个站点的话,发出一个请求之后,程序必须要等待网站返回响应之后才能接着运行,而在等待响应的过程中,整个爬虫程序是一直在等待的,实际上没有做任何的事情。
叶庭云
2020/09/17
3.9K0
Python爬虫学习笔记    asyncio+aiohttp 异步爬虫原理和解析
大型fastapi项目实战 高并发请求神器之aiohttp(下)
1.先通过 event_loop = asyncio.get_event_loop() 创建了一个事件循环 2.通过 asyncio.gather 接受多个 future 或 coro 组成的列表 任务 3.通过 event_loop.run_until_complete(task) 我们 就开启 事件循环 直到这个任务执行结束。 4.async with aiohttp.ClientSession() as session: 是创建了一个异步的网络请求的上线文管理具柄 5.async with session.get('http://www.baidu.com') as resp: 异步请求数据 6.res = await resp.text() 异步的接收数据 再解释一下两个关键词 1.async 如果一个函数被这个async 关键词修饰 那这个函数就是一个 future object 2.await 协程对象执行到这个关键词定义之处就会做挂起操作,原理是与yield /yield from 类似的。
python编程从入门到实践
2021/03/03
3.4K0
大型fastapi项目实战 高并发请求神器之aiohttp(下)
爬虫速度太慢?来试试用异步协程提速吧!
在执行一些 IO 密集型任务的时候,程序常常会因为等待 IO 而阻塞。比如在网络爬虫中,如果我们使用 requests 库来进行请求的话,如果网站响应速度过慢,程序一直在等待网站响应,最后导致其爬取效率是非常非常低的。
崔庆才
2018/07/31
3K0
手把手教你在Windows下设置分布式队列Celery的心跳轮询
大家好,我是吴老板。用Celery 官方的话来说,Celery 是一个非常优秀的分布式队列,可应用于分布式共享中间队列和定时任务等等。
Python进阶者
2021/03/09
8280
对FastApi的API进行限速
今天啊,我的朋友小绿跟我说,那天晚上有个人好快好快!我急忙问他,怎么回事?有多快!他说,他的资源分发接口被人以很快的速度攻击了。速度达到了 10000qps,这对于他那 0.1C125M 的机器来说简直是小车拉大牛,真费车。
Python研究所
2022/06/17
1.3K0
对FastApi的API进行限速
Python异步IO操作,看这个就够了
异步 IO 是一种并发编程设计,Python3.4 开始,已经有专门的标准库 asyncio 来支持异步 IO 操作。你可能会说,我知道并发用多线程,并行用多进程,这里面的知识已经够我掌握的了,异步 IO 又是个什么鬼?本文将会回答该问题,从而使你更加牢固地掌握 Python 的异步 IO 操作方法。
somenzz
2020/11/25
2.8K0
Python异步IO操作,看这个就够了
高并发之 API 接口,分布式,防刷限流,如何做?
降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题解决后再打开
芋道源码
2020/04/17
1.9K0
高并发之 API 接口,分布式,防刷限流,如何做?
如何在 Java 中通过 Bucket4j 提供速率限制?
时不时地,我们所有人都面临着限制我们的外部 API 的问题——出于多种原因,我们应该限制对我们 API 的调用的某些功能。
终码一生
2022/04/15
1.9K0
如何在 Java 中通过 Bucket4j 提供速率限制?
深入理解Python异步编程
对于其他的并发模型大多数采取的都是线性的方式编写。并且依赖于语言运行时系统或操作系统的底层线程或进程来适当地改变上下文,而基于asyncio的应用要求应用代码显示的处理上下文切换。 asyncio提供的框架以事件循环(event loop)为中心,程序开启一个无限的循环,程序会把一些函数注册到事件循环上。当满足事件发生的时候,调用相应的协程函数。
sergiojune
2019/05/07
2.3K0
Python asyncio之协程学习总结
协程(Coroutine)一种电脑程序组件,该程序组件通过允许暂停和恢复任务,为非抢占式多任务生成子程序。协程也可以简单理解为协作的程序,通过协同多任务处理实现并发的函数的变种(一种可以支持中断的函数)。
授客
2023/05/29
1K0
Python asyncio之协程学习总结
【Python3爬虫】使用异步协程编写爬
进程:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。进程是操作系统动态执行的基本单元。
py3study
2020/01/21
1.1K0
[译]PEP 525--异步生成器
花下猫语: 与生成器密切相关的 PEP 有 4 个,在翻译完《PEP255--简单的生成器》之后,我在交流群里说出了继续翻译的想法。恰巧,@cxapython 同学正着迷于异步,被我激起了翻译的念头,他竟然一连翻译出两篇介绍异步的 PEP:《PEP 530--异步推导式》《PEP 525--异步生成器》。今天,我给大家转载了第二篇(为了我们的生成器系列),大家若觉得赞,可以关注一下他的公众号哦。至于我正在翻译的 PEP 342,由于里面纯文字的内容太多了(估计全文近7000字),加上我这周比较忙,只能再拖稿两天了。最后,小声透露一下,我建了个 github 项目,计划收集与推进 PEP 的翻译,欢迎给 star 和做贡献哦。地址:https://github.com/chinesehuazhou/peps-cn
Python猫
2019/04/23
6560
使用 FastAPI+aiosqlite+databases 搭建服务端的基础用法
我在 aiosqlite 的仓库中搜到了这样一条 issue,作者为我们介绍了为什么使用 sqlite 数据库时连接池不是那么重要。我并没有说它不重要,只是在轻量级使用中可以不在意这点。我这里把原文复制过来,并且把重要句子标粗。
kifuan
2023/01/14
1.6K0
大型fastapi项目实战 高并发请求神器之aiohttp(上) [建议收藏]
在 Python 众多的 HTTP 客户端中,最有名的莫过于 requests、aiohttp 和 httpx。在不借助其他第三方库的情况下,requests 只能发送同步请求;aiohttp 只能发送异步请求;httpx 既能发送同步请求,又能发送异步请求。在并发量大的情况下,如何高效的处理数据,异步是我们的优选,今天我们主要详解的是在生产环境广泛使用的 aiohttp。
python编程从入门到实践
2021/02/04
10.6K0
FastAPI 异步后台任务阻塞其他请求如何处理?
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
山河已无恙
2023/11/27
1.6K0
FastAPI 异步后台任务阻塞其他请求如何处理?
常见的限流解决方案
降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题解决后再打开限流限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理
用户3467126
2019/10/29
4.4K0
常见的限流解决方案
相关推荐
FastAPI 接口限流
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验