【问题标题】:Crawling a website at uniform rate以统一速率爬取网站
【发布时间】:2014-01-25 19:35:06
【问题描述】:

我需要以每分钟 8 页的速度抓取一个网站。现在我希望我向远程服务器发出的请求在一分钟内均匀分布,这样就不会损害服务器它正在请求。

如何在两个连续请求之间保持以秒为单位的统一时间差?最好的方法是什么?

【问题讨论】:

  • 难道没有办法在 PHP 中设置某种延迟?
  • @Oleg 是的,它就在那里。但我猜,使用延迟并不好。不必要地消耗资源。我猜这不是一个可扩展的东西。
  • 您提到您有上限约束(每分钟 8 次),但您是否也有下限约束(例如每分钟最少次数)?如果不是,您可以每 60/8 秒使用您的编程语言版本的 sleep() ..?
  • @MeganSquire 没有其他解决方案?

标签: php web-crawler


【解决方案1】:

这里确实有两个不同的问题。让我们分别处理它们:

第一个问题

我需要以某种速度抓取一个网站,比如说,每个 8 页 分钟......这样它就不会损害它请求的服务器。

释义:我希望每分钟发送的请求不超过 8 个,因为我想对远程服务器友好。

对于这个答案,有一个related Stack Overflow question 关于使用 PHP 和 Curl 进行速率限制。

第二个问题

我希望我对远程服务器的请求是统一的 分布在一分钟内....我怎样才能保持统一的时间 两个连续请求之间的秒差

释义:我希望在每个查询之间有相同的时间。

这是一个与第一个不同的问题,而且更棘手。为此,您需要使用时钟来跟踪每个请求之前和之后的情况,并不断平均请求所花费的时间、您请求的睡眠时间和/或您调用 get() 的频率。您还必须考虑每个请求需要多长时间(如果您的连接非常滞后,这会降低您的平均速度,以至于您每分钟只执行 3 或 4 个请求......)

我个人认为这实际上不是您需要做的“以免损害服务器”。

原因如下:通常速率限制设置为“每个最低时间片的上限”。所以这意味着“每分钟 8 个请求”意味着它们可以在每分钟内同时出现,但每分钟不超过 8 个。速率限制器不期望它们会在一分钟内均匀分布。如果他们确实想要,他们会说“每五秒一个请求”。

【讨论】:

    猜你喜欢
    • 2011-10-09
    • 2011-01-11
    • 2012-09-24
    • 2019-07-19
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    相关资源
    最近更新 更多