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

Karen110
• 阅读 2325

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

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

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

Ratelimiter

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

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)  

输出结果如下

Iteration 0  
Iteration 1  
Rate limited, sleeping for 3 seconds  
Iteration 2  

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

达到了预期的要求

asyncio 异步中的使用

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 是没有问题的**

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

Slowapi

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

来看看具体的用法

# -*- 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)  

具体调用方法

# -*- 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,使用相对简单,大家可以一试并自行扩展

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

需要具体代码的小伙伴可以后台回复关键字:限制爬虫,进行获取。

**-----**------**-----**---**** End **-----**--------**-----**-****

往期精彩文章推荐:

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

欢迎各位大佬点击链接加入群聊【helloworld开发者社区】:https://jq.qq.com/?_wv=1027&k=mBlk6nzX进群交流IT技术热点。

本文转自 https://mp.weixin.qq.com/s/ORWMtdutROYIigOQhXPKOg,如有侵权,请联系删除。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
3年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
python使用aiohttp通过设置代理爬取基金数据
说到python爬虫,我们就会想到它那强大的库,很多新手小白在选择框架的时候都会想到使用Scrapy,但是仅仅停留在会使用的阶段。在实际爬虫过程中遇到反爬机制是再常见不过的,今天为了增加对爬虫机制的理解,我们就通过手动实现多线程的爬虫过程,同时引入IP代理
Wesley13 Wesley13
3年前
Java爬虫之JSoup使用教程
title:Java爬虫之JSoup使用教程date:201812248:00:000800update:201812248:00:000800author:mecover:https://imgblog.csdnimg.cn/20181224144920712(https://www.oschin
Stella981 Stella981
3年前
Nginx反爬虫: 禁止某些User Agent抓取网站
一、概述网站反爬虫的原因不遵守规范的爬虫会影响网站的正常使用网站上的数据是公司的重要资产爬虫对网站的爬取会造成网站统计数据的污染常见反爬虫手段1\.根据IP访问频率封禁IP2\.设置账号登陆时长,账号访问过多封禁设置账号的登录限制,只有登录才能展现内容
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
python访问百度关键词和链接
前几天在Python交流群有个同学分享了一份Python网络爬虫代码,用来获取某度关键词和链接的。其实这个需求之前我也写过代码,不过网页结构变化之后,之前的提取器已经失效了,所以代码就作废了。今天这里给再给大家分享一个使用python获取某度关键词的实践。由于某度也是设置反爬安全策略的,所有同一IP下程序运行次数多了也是会被封IP的,所有在访问过程中我们需要
爬虫代理IP是什么?为什么需要它?
爬虫代理IP是什么?为什么需要它?爬虫代理IP是指使用其他计算机的网络地址来访问目标网站的一种技术。它可以隐藏爬虫程序的真实IP地址,避免被网站识别和封禁12。在进行网络数据采集时,我们经常会遇到一些反爬措施,比如网站限制同一个IP地址的访问频率、次数或时