Flask中应结合User-Agent白名单与行为分析(如空UA+无Referer)识别恶意请求,优先使用Flask-Limiter做IP级频率限制并配置X-Forwarded-For解析,避免硬编码黑名单或手写中间件。
Flask里怎么识别并拦截恶意User-Agent
靠
字符串本身不能防爬,但能筛掉最懒的
爬虫
。关键是别只做字符串匹配,得结合行为判断。
常见错误是写死黑名单,比如一看到
就
——这会误杀内部健康检查、监控探针,甚至某些合法 SDK。
优先用白名单:只放行已知合规的浏览器
前缀(如
、
、
),其余默认放行(不是拦截)
真正要拦的,是明显异常的组合:比如
为空 +
头是
+ 没有
别在
里反复正则匹配全量
字符串,提取关键标识即可,例如:
用Flask-Limiter做IP级请求频率限制
是目前最稳的选择,底层支持
和内存存储,比手写计数器靠谱得多。
容易踩的坑是直接按
限流——Nginx反代后这个值永远是
,必须配
并读
。
立即学习
“
Python免费学习笔记(深入)
”;
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
初始化时指定
,不要依赖默认的
:
接口级限流用装饰器,但注意:如果路由带变量(如
),默认会把每个
当独立key;需显式聚合:
内存模式仅适合开发调试,生产必须连
,否则多进程下计数不同步
为什么单纯靠User-Agent+频率限制依然会被绕过
这两招对自动化脚本有效,但对真人操作的“云打码+代理池+浏览器指纹模拟”基本无效。
真正起作用的是叠加信号:比如同一IP在1分钟内触发3次
异常 + 2次429响应 + 1次非标准
,才升级为临时封禁。
别把防御逻辑全塞进一个中间件,拆成独立函数,方便后续接入风控规则引擎
记录原始
到日志时,记得截断(避免日志爆炸),例如只存前64字符:
频率限制的阈值别设太激进,
对移动端API可能误伤;建议先开日志观察真实流量分布,再定策略
不推荐手写中间件做这些事
自己解析
字符串、维护IP计数字典、处理并发写冲突——这些轮子早被
和
库覆盖了。
更麻烦的是边界情况:比如IPv6地址格式、Cloudflare转发的
头、HTTP/2里头字段大小写混用……全得自己兜底。
要用
库识别设备类型,别用
这种硬编码
所有限流配置必须可热更新,别写死在代码里;
支持从配置对象动态加载
记住:爬虫对抗本质是成本博弈。你加一层校验,对方就多花5分钟绕过;重点该放在让高价值数据访问路径更难批量获取,而不是拦住所有非浏览器请求
User-Agentpython-requestsabort(403)User-AgentMozilla/5.0Chrome/Safari/User-AgentAccept*/*Refererbefore_requestUser-Agentif 'scrapy' in request.headers.get('User-Agent', '').lower():Flask-LimiterRedisrequest.remote_addr127.0.0.1trusted_proxiesX-Forwarded-Forkey_funcget_remote_addresslimiter = Limiter(key_func=lambda: request.headers.get('X-Real-IP', request.remote_addr))/api/item/id@limiter.limit("5 per minute", key_func=lambda: request.endpoint)RedisUser-AgentAccept-EncodingUser-Agentlogger.info("UA: %s", ua[:64])10 per minuteUser-AgentFlask-Limiteruser-agentsCF-Connecting-IPuser-agentsre.search(r'iPhone', ua)Flask-LimiterDEFAULT_LIMITS