搜索引擎与爬虫

如何检测和验证搜索引擎爬虫?

web crawler recognition

我们生活在网络革命的时代。每天,越来越多的网站从纯 HTML 切换到富含 JavaScript 的网站。虽然用户可以从现代技术中受益(如果他们愿意更新他们的浏览器),但网络爬虫很难做到这一点。

在搜索市场,谷歌是毋庸置疑的领导者。它不仅在市场份额上领先,而且在技术上也处于领先地位。然而,即使是谷歌也有一些限制。Googlebot 不会像普通用户那样与您的网站互动,这可能会阻止它发现您的某些内容,尤其是当它依赖于 JavaScript 时。

一种解决方案是向爬虫程序提供 HTML 文件的预渲染版本,而不是 JavaScript 代码。这种技术不被视为伪装,并且是谷歌允许的。

为了做到这一点,我们必须能够检测请求是由用户还是机器人发出的。

让我们从一些基础知识开始。

recognition crawler

什么是爬虫?

如果您正在寻找一种检测和验证爬虫的方法,您可能已经知道它们是什么。尽管如此,爬虫(有时称为蜘蛛)是爬网的计算机程序(机器人)。 换句话说,他们访问网页,找到指向更多页面的链接,并访问它们。他们通常会映射他们发现稍后用于搜索目的(索引)的内容,或帮助开发人员诊断他们网站的问题。

为什么有人想要检测它们?

如果您拥有一个网站并希望在搜索结果中可见,例如 Google 搜索结果,您需要先被其抓取工具访问。他们必须能够抓取您的网站并将您的内容编入索引。

如果您在网站上发现 SEO 问题,检查 Googlebot 请求的服务器日志可能是诊断问题所需采取的步骤之一。

还有更具体的用途。例如,在某些国家/地区,您可能在法律上被迫限制对您网站的访问。在阻止用户的同时,您应该允许来自该国家/地区的搜索机器人访问,特别是如果该国家/地区恰好是美国(Googlebot 主要从美国抓取)。

正如开头所说,JavaScript 在网络上的不断增长的使用肯定对用户有利,但渲染 JS 对搜索引擎来说是一个挑战。如果您的网站没有被机器人正确处理,或者您的内容经常更改,您应该动态呈现您的页面,并将呈现的 HTML 提供给爬虫而不是 JavaScript 代码。

Javascript render

显然,为了做到这一点,您必须知道请求是由真实用户发出的,还是由爬虫发出的。

用户代理检测 – 你好,我的名字是 Googlebot

google bot

当您浏览网页时,您有时可能会感到匿名。但是,您的浏览器从来没有。它发出的每个请求都必须用其名称签名,称为用户代理。

例如,Chrome 浏览器的用户代理: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36

机器人也有独特的用户代理,例如以下名称属于桌面版 Googlebot: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

他们就不能撒谎吗?

真正的 Googlebot 不会具有欺骗性,并且会以其真实姓名进行自我介绍。

但是,还有其他可能有害的机器人会使用 Googlebot 的名称进行自我介绍。某些浏览器还可以更改用户代理。

例如,您可以使用 Google Chrome Inspect 工具伪造 Googlebot 。 我们在做 SEO 的时候还经常访问页面,甚至抓取整个网站,将自己介绍为 Googlebot 以进行诊断。

但是, 如果您正在寻找一种方法来检测来自特定机器人的所有请求,并且您不介意包括来自对其身份撒谎的来源的请求,那么用户代理检测方法是最容易和最快实现的。

验证方法

如果您需要正确验证请求的来源,则需要检查发出请求的 IP 地址。

在这件事上撒谎是很困难的。可以使用 DNS 代理服务器并隐藏真实 IP,但这会暴露代理的 IP,而该 IP 是可以识别的。如果您能够识别源自爬网程序 IP 范围的请求,则您已完成设置。

一些抓取工具会提供 IP 列表或范围供您使用,但大多数抓取工具(包括 Googlebot)都没有。并且有充分的理由不这样做。尽管如此,它们还是提供了一种验证请求 IP 的方法。

在我解释如何做到这一点之前,让我们回顾一下并探索您应该验证爬虫请求的场景。

  1. 我们将探讨的第一个场景是服务器日志分析。您肯定不希望访问您网站的讨厌的抓取工具在您的日志中显示为 Googlebot。想象一下,由于某种原因,您网站的一部分未编入索引,因为它在 robots.txt 中被阻止,但是在您的日志中,您可以看到该部分的点击是由一个不关心 robots.txt 的抓取工具完成的。如果您不过滤掉该爬虫,您将如何确定真正的 Googlebot 是否能够访问这些页面?

  2. 您真正想要避免的另一种情况是使用您网站的预渲染版本来提供抓取工具。这在两个方面是有害的。第一:预渲染花费服务器处理时间。这个成本是不可忽视的,很多请求会显着影响你的性能!您只想为您关心的爬虫进行渲染。第二:呈现 JavaScript 可能很困难。如果那些烦人的抓取工具将获得未渲染的 JavaScript,那么它们中的一些很有可能无法窃取您的内容。

好的,现在让我们开始看看如何判断搜索引擎爬虫的 IP 地址。

IP 范围

如上所述,一些流行的搜索引擎爬虫提供静态 IP 列表或范围。我会在这里列出一些。

DuckDuckGo:

DuckDuckGo

DuckDuckBot IP 地址列表

baidu.com:

baidu spider

百度蜘蛛 IP 列表

TwitterFacebook允许您通过运行以下 Bash 命令来下载他们当前的 IP 列表。

facebook and twitter crawler

Bash 是一个 Linux 命令行环境。

Googlebot 验证

Googlebot

GoogleBot IP 列表

Bing

Bing bot

Bing bot IP 列表

白名单

在这一点上,您可能会问自己为什么 Google 没有像 Facebook 那样发布他们的 IP 列表。答案很简单:他们的 IP 范围将来可能会发生变化。这样的列表肯定会在某些服务器配置中幸存下来,使它们在未来容易受到欺骗。

尽管如此,您不应该对每个请求都使用查找方法!这将缩短您的第一个字节时间 (TTFB),并最终减慢您的网站速度。 您想要做的是创建一个临时 IP 白名单。

基本思想是,当您收到来自 Googlebots 用户代理的请求时,首先检查您的白名单。如果它在列表中,您就知道它是一个有效的 Googlebot。

如果它来自不在白名单上的 IP 地址,您需要执行 nslookup。如果地址验证为肯定,则进入白名单。

请记住,白名单是临时的。您应该定期删除或重新检查所有 IP 地址。 如果您收到大量错误请求,您可能还需要考虑使用黑名单来排除此类请求,而无需进行 DNS 查找。

您会在下面找到一个简单的图表,它代表了上述想法。

bot ip query

概括

在开始实施这些解决方案之前,先问问自己真正需要什么。如果您需要检测机器人并且不介意误报,那么请进行最简单的用户代理检测。但是,当您寻求确定性时,您需要开发 DNS 查找程序。

这样做时,请记住,您确实希望避免增加服务器响应时间,DNS 查找肯定会这样做。实现一些缓存查找结果的方法,但不要将它们保留太久,因为搜索引擎机器人的 IP 地址可能会改变。

文章来源:Marcin Gorczyca