前言
生成式 ai 的发展和逐渐成熟,给人们带来了便利的同时也给内容创作者带来了负面影响。它降低了资料原始出处的访问价值,减少了网站的利益(流量、收益和创作积极性)。如果你跟我一样,想在自己的网站屏蔽 ai 的抓取,那么这篇文章就是为你准备的。
这是一篇新手向教程。过程十分简单。
屏蔽原因
虽然我在前言中有所提及,但并没有特别深刻的剖析所谓的负面影响。因为本文的重点是屏蔽方法,而不是屏蔽原因。
你可以参考此文了解我的更多看法。
配置 robots.txt
具备最基本 seo 常识的站长应该都知道 robots.txt 是什么,它是一个用来控制搜索引擎爬虫抓取范围的文件。我们可以在 robots.txt 屏蔽某些页面/某些爬虫,或仅允许某些爬虫。
举个最典型的例子:
user-agent:*disallow:/admin/。
上述 robots.txt 规定了任何爬虫都不允许访问 /admin/ 路径的页面。这个声明非常常见,因为将网站后台索引到搜索引擎中是毫无意义的,还会招来不必要的风险。
当我们要屏蔽特定的爬虫时,就需要将 * 改为该爬虫的 user-agent 字符串。如果要屏蔽多个,那么就写上多个 user-agent 字段,再接一个 disallow 字段即可。
user-agent:gptbotuser-agent:claude-webuser-agent:claudebotdisallow:/。
以上 robots.txt 屏蔽了 chatgpt 和 claude 这两个目前最著名的 ai 产品的抓取。
扩充列表
在了解原理后,我们通过网友们整理好的 ai.robots.txt 仓库,进一步扩充 ai 爬虫的 ua 规则。
robots.txt 的可靠性
配置好 robots.txt 能代表相安无事吗?此文件真的能有效拒绝它们吗?
答案是否定的,因为 ai 的爬虫并不像搜索引擎爬虫那样成熟。它们可能会忽略 robots.txt 的后续更新,甚至在规则的解析和执行中发生错误。搜索引擎往往不用我们担心,因为从控制台能看到爬虫的行为,或自行测试搜索结果。但 ai 爬虫的行为就是黑盒,你什么也无法确定。所以我们要进一步的使用 nginx 屏蔽它们。
配置 nginx
如果你跟我一样并不信任 ai 爬虫的行为,那么就有必要在访问控制层面去屏蔽它们。nginx 是绝大多数网站都会使用的反向代理工具,在 nginx 层面可以轻松做到针对 user-agent 的屏蔽。
我们添加以下配置片段:
set $is_bot 0;# 定义变量表示此次访问是否为 ai bot,默认为 0(否)if ($http_user_agent ~* (gptbot|claude-web|claudebot)) { # 如果请求的 user-agent 和 ai bot 的规则匹配,那么设置 `is_bot` 为 1(是) set $is_bot 1;}if ($is_bot = 1) { # 如果是 ai bot,返回 403 return 403;}
nginx 中的 $http_user_agent 是一个内置变量,表示当前请求的 user-agent 字符串。~* 是一个正则匹配操作符(忽略大小写)。我们用正则来判断请求是否是 ai bot,如果是就返回 403 页面。
进一步的,按照扩充列表章节中的开源仓库补充正则,就能轻易的从访问控制层面屏蔽这些 ai 爬虫。现在无论这些爬虫是否遵循 robots.txt 规则,我们都能有效的拒绝它们。
现实情况是,往往这个列表太长了。所以单纯的 if 和正则并不推荐,我们应该将其转换为 map 块,如下:
map $http_user_agent $user_agent_from_ai { default 0;# 默认值为 0 ~*gptbot 1; ~*claude-web 1; ~*claudebot 1; ~*kangaroo\sbot 1; # 添加更多...}
注意以上的 kangaroo\sbot,它实际上对应 kangaroo bot。但我们不能包含空格,因为它会被解析为新的参数。使用正则表达式中的 \s 来表示一个空格。
最后用 if 判断 $user_agent_from_ai 的值:
if ($user_agent_from_ai = 1) { # 如果是 ai bot,返回 403 return 403;}
足够了吗
答案仍然是否定的。尽管在以上方法中,我们貌似在“约定”层面和“访问”层面都拒绝了它们,但这基于我们对 ai 公司/爬虫一定程度上的信任。
起码我们认为它们不会伪装而是使用固定的 user-agent。所以这样做只能防君子,不防小人。假设爬虫简单的伪装一下自己,访问控制就失效了。不过,我仍然认为行业巨头在这方面是值得信任的,但小团队的产品就不一定了。
要屏蔽经过伪装的 ai 爬虫其实是很困难的,但也不是没有办法。如果对大量的 nginx 日志/请求日志进行复杂的特征/行为分析,我认为能一定程度上识别出爬虫。甚至收集到它们的 ip 地址,针对 ip 进行更彻底的屏蔽。但我们往往没有那么庞大的数据量来做这样的分析,若是 cloudflare 这样的大型 cdn 服务商,那就有条件做到。恰好我了解到 cloudflare 已经研发了相应的功能,并且是免费使用的。
使用 cloudflare
进入 cloudflare 的“安全性” ->“自动程序”页面,勾选“阻止 ai 爬虫程序和爬网程序”功能即可。
此功能可以一定程度屏蔽具有伪装性的爬虫,也包括老实使用自己的 user-agent 的爬虫。如果使用过 cloudflare 的防火墙等抵御攻击相关的功能,应该会知道它们有对客户端 ip 进行评分,以及可靠的指纹识别、大模型行为识别等技术。所以我认为 cloudflare 还是可以做好这部分的。
那么使用这个功能,会对 seo 造成影响吗?毕竟搜索引擎的爬虫也可能具有明显的特征。好问题,cloudflare 自然也考虑到了。它们维护了一个已验证机器人列表,其中包含几乎已知的主流搜索引擎爬虫,并允许它们的抓取。
对抗 ai
以上配置中我们对 ai 爬虫响应 403,但它不是唯一可取的响应方式。如果你认为有些爬虫过于困扰,反复变化毫无规则。那么就成全它让它抓取吧,先收集其 ip 并然后使用 miragend 来污染它。
结束语
这就是屏蔽 ai 爬虫的方法了。不过请注意,此文的方法仍然比较基础,适合个人。如果有大型互联网平台/社区需要这方面的支持,可以联系我,我提供收费的技术支持。当然,如果有效果更好的适合新手的方法,我也会毫不犹豫的分享出来。毕竟我是一个坚定的生成式 ai 无授权抓取内容行为的反对者。