当我写我的网络爬虫时,我没有想出一个神奇的算法。我们使用了一些启发式方法,这些方法似乎做得相当不错,尽管肯定不是完美的。
首先,我们查看了站点的 robots.txt 文件。如果它有一个爬行延迟条目,我们不会超过它来尊重它。
对于其他服务器,我们将保持最后 n 个请求所需时间的平均运行时间(我认为我们确定了值 5),并且我们将确保我们发送请求的频率永远不会超过该平均值。我们测量了从发出请求到完成处理响应的时间。
如果服务器超时,则该请求的时间将进入运行平均值。
如果我们从服务器获得 50x,我们会在向该服务器发出另一个请求之前延迟相当长的时间(五分钟或更长时间)。重复 50 次响应将导致我们停止发出请求,直到有人可以查看问题所在。
我们还跟踪了 40 倍的响应。许多未找到或访问被拒绝会导致爬虫停止处理域并引发标记,以便有人可以查看它。
我们有一个分布式爬虫。没有单个爬虫会向同一个域发出并发请求,并且我们有一些跨服务器通信,这使得多个服务器向同一个域发出并发请求是不寻常的。
我确信这并没有最大化任何特定服务器上的吞吐量,但它确实让较大的站点非常繁忙。对我们来说更重要的是,它阻止了我们(大多数情况下,无论如何)被许多网站阻止。
我们还对许多使用 API 的站点进行了特殊情况处理。有些人会说他们的请求限制是多少,我们会调整这些站点的设置,以便我们直接排队。但我们只有几十个。手动配置 9,000 台服务器的请求频率(然后跟上变化)是不现实的。但是,您也许可以手动配置十几个或两个。