前言
最近几个月,我都有研究对抗有害爬虫的方法。我收集到来自几十个不同 ISP 的爬虫,有些已经确认并关联了相关的应用(例如所谓的 AI 搜索产品),有些还在等待调查。
在本文我将分享一些获取这些有害爬虫 IP 的方法,并预告一些我针对它们采取的措施。
有害爬虫
首先我们要定义一下,为何非法,又为何有害。很简单,模拟真实用户的爬虫,必然是非法的爬虫。这类爬虫甚至没有提供屏蔽它们的方法,更不要提遵循 robots.txt 了。
如何界定非法爬虫是否有害?首先要搞清楚,这里的有害是对谁有害,当然是对我们即网站的所有者有害了。例如某些 AI 产品,它们通过非法爬虫抓取我们的数据,然后向他们的用户展示从我们这里复制、总结的内容。这甚至是损人利己的(我如何看待 AI 抓取我的博客)。
既然损害我们的利益,它当然就是有害的爬虫。对于这类有害的爬虫,是必须对抗甚至惩治的。一般的方法对他们无效,因为他们几乎不遵循任何规则,所以我们需要一些特殊的方法。
钓鱼
由于这些爬虫程序是模拟真实用户请求的,我们无法通过 User-Agent 或其它头信息做判断。有些爬虫可以相当深度的模拟,例如通过 TLS 指纹识别。有时候 Cloudflare 的防护对它们都无效,这取决于爬虫开发者的能力(不要怀疑,我就可以做到)。
所以我们要切换思路,不再检测它们,而是“诱惑”它们。为它们定制一些蜜罐网页,让它们自投罗网。落入陷阱的爬虫的 IP,我们就可以直接屏蔽了。这是针对各种的未知非法爬虫非常有效一种思路。
隐藏链接
我们可以添加一些隐藏链接,避免用户访问,但又让爬虫很容易的获取到它。最典型的方式,就是把链接加入到网站地图(Sitemap)中。不要添加任何内链,所以用户是访问不到的。例如:
网站地图(Sitemap)用于告诉搜索引擎网站的结构,是 SEO 必备的文件。搜索引擎(包括其它用途的爬虫)会定期访问这个文件,以获取网站的最新和已修改的链接条目。
我们甚至都不需要确保 /posts/11e06c47-0e54-4797-ad33-dddcdfca0803.html 这个页面是存在的。因为即使不存在,那也得访问过后才知道。非法爬虫为了第一时间获取我们的所有网页,会经常光顾我们的 Sitemap。但没有用户会这么做,所以 Sitemap 就是一个天然的鱼池。
我们将该页面的所有访问记录收集起来,它们基本上全部都是爬虫。然后就可以进一步的分析它们的请求特征、IP 地址等信息。
如果你担心爬虫看不到这个链接,可以放在页面中。例如每个页面都会包含的页脚部分。但用样式隐藏起来,让用户不可见也无法点击。
结合 robots.txt
以上的钓鱼链接有一个弊端,就是无法区分合法和非法爬虫。到时候 Google 和 Bing 等搜索引擎也会访问该页面。由于该页面不存在,还可能给你报告一些错误。并且两类爬虫混淆在一起,你不得不做一个筛选的过程。但如果你将隐藏链接和 robots.txt 结合起来,就可以直接区分这两类爬虫。
我们在 robots.txt 中添加如下内容:
Disallow: /*?bad_bots_block
接着修改 Sitemap 中的钓鱼链接:
如上所示,我在链接后面添加了 bad_bots_block 参数,但这个参数同时又在 robots.txt 中禁止。所以 Google 和 Bing 等正规搜索引擎的爬虫并不会抓取这个链接,因为它被规则屏蔽了。而非法爬虫不会管这些,有新链接它就访问。
所以呢,现在凡是有 /posts/11e06c47-0e54-4797-ad33-dddcdfca0803.html?bad_bots_block 访问记录的,不用筛选,几乎可以直接判定为非法爬虫。
陷进表单字段
这里假设你要对抗的是会进一步模拟用户操作的非法 bot。例如它会模拟注册帐号、提交垃圾信息等,任意一种涉及表单提交的都可以。
接着我们通过样式隐藏蜜罐字段,但不要使用 display: none 或 visibility: hidden 这些显而易见的隐藏方式。因为爬虫可以轻易的从样式中判断元素被隐藏了。
.hidden-field {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
我们把元素压缩到最小尺寸,故意移出容器会因溢出而被剪裁掉。虽然对用户是不可见的,但仍然实际存在。
一旦检测到 username 字段被填写了,那么这个提交请求就是非法 bot。因为正常用户是看不到这个字段的,所以也无法填写。接着我们在前端/后端中读取蜜罐字段的值,即可判断是否是非法 bot。
如果你想收集 IP,那就不要在前端阻止。
后期对抗
有了非法爬虫 IP 后,我又进行了一些筛选。首先,我会尝试找出该爬虫对应的应用,如果是 AI 搜索、AI 大模型这类产品,我可能会直接投毒。即对它们的 IP/CIDR 或 ISP 响应“定制”后的内容。实际上我已经对某些产品这么做了,并且取得了一些十分滑稽的效果。当我公开相关工具时,我会展示这些效果。
其余的爬虫,虽然非法但是无害的,我会视情况而定。如果是能给我带来流量的,我可能会放过。其余的一律返回乱码。这也是我近期正在开发的工具的功能。
相关工具已发文:点此阅读。
结束语
这就是收集非法爬虫 IP 的一些方法了。后续我还会继续补充新的教程,并公开一些使用有害爬虫的实际产品(AI 搜索是重灾区)。并提供针对这类爬虫的工具。敬请期待。