指南

挡住爬虫,又不把 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 套餐在关闭拦截的状态下运行这套分类。在这个领域尤其应该这样开始,因为这里代价最高的错误,是三周后从搜索流量的下滑中才发现自己的规则一开始就是错的。

FAQ

怎样挡住爬虫又不挡住 Googlebot?
校验你想要的爬虫,而不是相信它们的 User-Agent。对主流搜索引擎,对来访地址做反向 DNS 查询,确认它解析到运营商的域名,再确认该名字解析回同一个地址;若干运营商还发布签名的网段清单。把这做成一条在任何评分之前执行的硬性放行,其余一律按行为和传输层指纹评分。
能靠 User-Agent 认出 Googlebot 吗?
不能,而且依赖它比什么都不做更糟。User-Agent 是客户端自选的字符串,任何爬虫都能用一行配置自称 Googlebot——一条放行该字符串的规则,就放行了所有复制它的爬虫。真正能定论的校验是反向加正向 DNS。
robots.txt 能挡住爬虫吗?
不能。它表达的是一种偏好,守规矩的爬虫遵守它是因为名声有赖于此;爬虫没有名声可失,因此会无视它。它同时还是一份公开的、列出你认为敏感的路径的清单,所以不能当安全措施用。请为可信爬虫把它维护准确,对其余者另行拦截。
该不该屏蔽 AI 爬虫?
这是商业决定而非安全决定,取决于出现在 AI 答案里对你是否比内容本身更值钱。如果决定屏蔽,robots.txt 覆盖那些发布并遵守退出令牌的爬虫,会话级识别覆盖不遵守的那些——用的正是抓住任何其他未申报爬虫的同一套信号。