0

我从网上抓取了一些数据,因为没有 API。不幸的是,这是来自几个不同站点的大量数据,我很快了解到我不能在短时间内向同一个站点发出数千个请求......我想尽快处理数据,但我不不想引起 DOS 攻击 :)

问题是,每台服务器都有不同的功能,而我事先并不知道它们。这些网站属于我的客户,所以我的目的是防止我的脚本导致任何可能的停机。所以没有像“我会先尝试百万请求,如果失败,我会尝试 50 万,如果失败...... ”这样的政策:)

有什么最佳做法吗?Google 的爬虫如何知道它可以同时对同一个站点执行多少个请求?也许他们“打乱他们的播放列表”,所以对单个站点的并发请求并不多。我可以通过 HTTP 以某种方式检测到这些东西吗?等待单个请求,计算响应时间,大致猜测服务器的平衡程度,然后以某种方式构成最大并发请求数?

我使用 Python 脚本,但这对于答案并不重要 - 只是为了让您知道我更喜欢哪种语言的潜在代码片段。

4

1 回答 1

1

谷歌蜘蛛非常聪明。在我的小网站上,它每分钟到第二个页面会打到我一页。他们显然有一个页面队列,已填满,牢记时间和站点。我还想知道他们是否足够聪明,不会在同一台服务器上访问多个域——因此可以识别 IP 范围和 URL。

对于任何蜘蛛来说,将在特定时间将要被蜘蛛抓取的 URL 排队的工作与实际的蜘蛛工作分开,这将是一个很好的架构。您所有的蜘蛛都可以使用urlToSpiderService.getNextUrl()阻止(如有必要)的方法,除非要蜘蛛下一个 URL。

我相信谷歌会查看网站上的页面数量来确定蜘蛛速度。在给定时间内刷新的页面越多,它们访问该特定服务器的速度就越快。您当然应该能够将其用作指标,尽管在您进行初始爬网之前很难确定。

您可以从每分钟一页开始,然后随着特定站点的要爬取的页面的增加,您将减少延迟。需要类似以下的某种功能:

 public Period delayBetweenPages(String domain) {
     take the number of pages in the to-do queue for the domain
     divide by the overall refresh period that you want to complete in
     if more than a minute then just return a minute
     if less than some minimum then just return the minimum
 }

我可以通过 HTTP 以某种方式检测到这些东西吗?

有了现代互联网,我看不出你怎么能。当然,如果服务器在几秒钟后返回或返回 500 错误,那么您应该节流回来,但是如今对于大部分服务器来说,典型的连接和下载是亚秒级的,我不确定有多少从该领域的任何统计数据中学习。

于 2012-09-07T13:18:55.847 回答