今日所学 ·
反爬虫之Lightpanda
反爬不一定要等请求进入应用后再处理。如果请求的 User-Agent 已经明确表明自己是 Lightpanda 或其他无头浏览器,就可以在 Nginx 层尽早结束请求,避免它继续消耗 Next.js、API、数据库和埋点服务的资源。
Nginx 的 map 可以根据 $http_user_agent 生成一个变量。map 需要放在 http 上下文中:
map $http_user_agent $is_headless_browser {
default 0;
~*(lightpanda|headless[[:space:]]*chrome|playwright|puppeteer|selenium) 1;
}
然后在请求进入应用前直接返回 403:
if ($is_headless_browser) {
return 403;
}
这种方式的优点是便宜。判断只是发生在 Nginx 层的一次字符串匹配,不需要启动应用逻辑,也不会让一个已经可以识别的自动化请求继续穿过后面的服务链路。
但它不能被当成完整的反爬系统。User-Agent 是客户端主动发送的,自动化程序可以把自己伪装成普通 Chrome;一旦对方隐藏了自动化工具的名称,这条规则就无法识别。MDN 也提醒,依赖 UA 字符串判断客户端很难做到可靠,还容易产生误判。
因此,更合理的定位是:
- 只拦截明确自报身份的自动化工具;
- 不把普通浏览器关键词加入黑名单;
- 将它作为请求入口处的低成本过滤;
- 更复杂的判断交给限流、行为分析、验证码或 WAF。