挡住爬虫,又不把 Google 挡在门外
如何区分你想要的和不想要的爬虫、为什么按 User-Agent 判断比什么都不做更糟,以及该拿那些「比你的规则还守规矩」的爬虫怎么办。
问题不在抓取,而在于分辨
几乎每个站点都想要一部分自动化流量。搜索引擎、聊天和社交链接背后的预览抓取器、你自己的监控、合作方的对接、无障碍工具。几乎每个站点也都有它不想要的自动化流量:比价爬虫、内容镜像、库存机器人,以及越来越多的 AI 训练爬虫——它们对你的价值属于见仁见智。
两者都以软件发出的 HTTP 请求的形式到来。除非它们自己乐意,否则都不会如实交代身份。于是整个问题归结为分类,而每一种分类错误的代价指向不同方向。
挡错了人,你会掉出索引——这种错误往往几周后才被察觉,纠正起来更久。放错了人,一小时内你的价格就会出现在竞争对手的站点上。不存在一个两个方向都安全的设置,所以这件事值得做得仔细,而不是做得快。
为什么按 User-Agent 判断会失败
User-Agent 是客户端自己选定的一串字符。它是一种声称,不是证据;把它当证据用,会同时朝两个方向出错。
任何东西都能自称 Googlebot,爬虫也确实这么做——一行配置的事,对任何检查这串字符的站点都奏效。如果你的规则是「放行 Googlebot」,你写下的其实是「放行一切自称 Googlebot 的东西」。
与此同时,你会挡掉本想留下的真爬虫,因为你根本枚举不完。合法抓取器有几十个,其字符串你从没见过,而且每个月都会冒出一个新的。
正确的校验不是字符串比较。对主流爬虫,做法是对来访地址做反向 DNS 查询,确认它解析到运营商自己的域名,再做一次正向查询,确认该名字解析回同一个地址。若干运营商还会发布签名的 IP 段清单,可以下载并缓存。
这并不难,但必须对每一个你在意的爬虫都做一遍,在网段变化时保持更新,并做好缓存,免得把 DNS 查询放进请求路径里。
robots.txt 是一块牌子,不是一道围栏
robots.txt 告诉守规矩的爬虫你的偏好。搜索引擎遵守它,是因为被抓到违反的代价高于内容本身的价值。爬虫既没有这种动机,也没有需要维护的名声。
更糟的是,它是一份公开文档,列出了那些你认为敏感到值得一提的路径。禁止 /admin、/export 或 /api/internal,等于宣告它们存在。请把它当成给你信任的爬虫看的指引,而不是安全措施。
但它仍然值得维护。一份带抓取延迟指令的正确 robots.txt,能降低那些确实遵守它的爬虫带来的负载——在多数站点上这是绝大部分流量——而且它是你对那些发布退出令牌的 AI 爬虫唯一的抓手。
真正能把它们分开的是什么
按每一项能贡献多少答案排序。
对可校验者做校验。反向加正向 DNS,或一份公开的网段清单,能对主流搜索引擎给出确定结论。这应当是一条硬性放行,并且要排在所有其他规则之上。
对其余者用传输层指纹。爬虫是一个程序:curl、某个 Python 库、无头浏览器、Go 的 HTTP 客户端。它的 TLS 握手会通过有序的密码套件与扩展集合——归纳为 JA3/JA3N——告诉你是哪一个。一个自称 Windows 上 Chrome、却出示 Chrome 不会产生的指纹的客户端,已经把自己是什么告诉了你。
整个会话中的行为。请求资源却从不执行;请求节奏精确到毫秒地均匀;在站内的路径沿着 sitemap 而不是导航走;在带交互元素的页面上没有任何鼠标移动。单看每一条都不足以定论,合在一起则接近定论。
首次接触时的信誉。全新的地址在你这里没有历史。如果它上周抓过别人,那就是它最初那一个请求上唯一可用的信号。
不会反噬自己的拦截方式
对已确认的爬虫做什么,和识别出它同样重要。
不要下发验证码。通过打码服务,它对有决心的爬虫只值几分之一美分,而对你则要付出被它一并误伤的真实用户。
别误伤搜索引擎。已校验的爬虫应当由一条在任何评分之前执行的规则放行,这样评分里的缺陷就不会让你丢掉排名。请在每次改动之后核对这一点,而不是之前。
考虑慢车道而不是一堵墙。刻意放慢地服务爬虫,或者用过期缓存服务它,往往好过一个 403:这消耗的是它的时间,而不是提醒它换战术,也不会造成「挡掉了你需要的东西」时那种事故。
在昂贵的地方限流。你的搜索接口和商品 API 值得设置限额,而静态页面并不需要。
盯住你放行了什么,而不只是你挡了什么。一个开始能通过的爬虫,在你的拦截看板上看起来和一个平静的星期一模一样。请长期跟踪拦截量与放行量之比,并对这个比值设告警。
Karma 处在什么位置
Karma 自己校验合法爬虫,并把它们从你的判定中排除——也从你的账单中排除,因为为「认出 Googlebot」向你收费,等于为产品自己的本职工作收费。
其余一切都依据行为与传输层信号评分,判定交给你的网关,由你决定这意味着拦截、慢车道还是过期缓存。你的放行与拒绝名单始终高于平台判定,因此你依赖的合作方可以在你启用任何东西之前先行固定下来。
免费的 Detect 套餐在关闭拦截的状态下运行这套分类。在这个领域尤其应该这样开始,因为这里代价最高的错误,是三周后从搜索流量的下滑中才发现自己的规则一开始就是错的。