Firebase云函数使用node-fetch请求外部URL触发机器人检测如何解决?
可排查的反爬绕过方向
- 补全完整的浏览器请求头:仅设置User-Agent不足以绕过校验,要把普通浏览器访问时携带的
Accept、Accept-Language、Accept-Encoding、Referer等常规头全部按真实浏览器的值补充,部分站点会校验请求头的完整性,缺少常规头会直接判定为爬虫。参考配置如下:
const fetchOptions = { method: 'GET', headers: { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", "Accept-Encoding": "gzip, deflate, br", "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "none" } }
- 开启自动重定向跟随:部分站点会先做301/302跳转校验,node-fetch默认不会跟随所有重定向,需要手动设置
redirect: 'follow',同时调整maxRedirect参数到合理值(建议设为5),避免被跳转校验拦截。 - 处理Cookie校验逻辑:部分站点会先下发Set-Cookie头,要求后续请求携带对应Cookie才能返回正常内容,可以配置http(s) agent开启Cookie自动携带,或者第一次请求拿到Cookie后第二次再发起请求获取页面内容。
- 修改TLS指纹特征:node-fetch底层的Node.js TLS握手指纹和常规浏览器差异明显,很多反爬服务会通过JA3指纹识别非浏览器请求,可以改用
got-scraping、无头浏览器类的工具发起请求,这类工具会模拟浏览器的TLS指纹特征,绕过指纹校验。 - 模拟社交爬虫标识:多数站点对社交媒体爬虫做了专门的白名单放行规则,你可以在请求头的
User-Agent里加入常见社交爬虫的标识(比如facebookexternalhit/1.1、Twitterbot/1.0),很多站点会直接返回带OG标签的静态内容,不会触发反爬逻辑。 - 调整请求速率:如果短时间内批量请求同一个站点,会触发站点的频率限制,可给不同域名的请求加1-3秒的随机延迟,降低被拦截的概率。
- 排查IP段黑名单问题:Firebase云函数的出口IP属于GCP公共IP段,很多站点会直接屏蔽主流云服务商的IP段,即便你绑定了自有域名,反向解析仍会暴露云服务属性,上述方案都无效的情况下,可以通过代理服务转发请求,使用住宅类IP发起抓取。
内容的提问来源于stack exchange,提问作者SupRob
相关产品推荐
相关产品推荐

