跳转到主内容
极星编程网:以代码为星,赴技术山海!

Python编写Flask接口如何防止爬虫抓取_使用User-Agent与频率限制

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

相关文章