如何检测我可以安全地在某人的服务器上执行的合理数量的并发请求?

时间:2012-09-07 13:15:35

标签: http concurrency web-crawler denial-of-service

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

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

这有什么最好的做法吗? Google的抓取工具如何知道在同一网站上可以执行多少次请求?也许他们“洗牌他们的播放列表”,因此对单个站点的并发请求数量并不多。我可以通过HTTP以某种方式检测到这些东西吗?等待一个请求,计算响应时间,大致猜测服务器的平衡程度,然后以某种方式组成最大并发请求数?

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

1 个答案:

答案 0 :(得分:1)

谷歌蜘蛛非常聪明。在我的小网站上,它每分钟打到我的第二页。他们显然有一个填充的页面队列,记住时间和网站。我也想知道他们是否足够聪明,不能在同一台服务器上访问多个域 - 所以对IP范围以及URL进行识别。

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

我相信Google会查看网站上的网页数量,以确定蜘蛛的速度。您在给定时间内刷新的页面越多,他们需要更快地访问该特定服务器。您当然应该能够将其用作指标,但在您完成初始爬网之前,很难确定。

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

 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个错误,那么你应该限制方式,但是现在大部分服务器和我的典型连接和下载都是亚秒级的我不确定该领域的任何统计数据都有很多值得学习的地方。