关于爬虫的礼貌并交叉验证我是否正确行事?

时间:2014-04-27 09:42:33

标签: java web-crawler

我正在尝试为我的项目构建一个爬虫,只是遇到了礼貌问题[我已经理解了它的需要]。我在java中开始使用以下代码:

try{
  URL seedPage = new URL("SeedPage to fetch");
  BufferedReader br = new BufferedReader(new InputStreamReader(seedPage.openStream()));
  String line="";
  while(null != (line = br.readLine()){
     TimeUnit.SECONDS.sleep(2) //2 seconds of delay here and the question lies here.
     //do Something
  }
} catch (Exception ex){
}

这样做[礼貌]正确吗?我希望我不会在处理我的请求的服务器上施加任何负担。

2 个答案:

答案 0 :(得分:1)

可以像服务器发送的那样快地接收页面。毕竟,人们使用Firefox等网络浏览器,并尽可能快地接收每个页面。

当您想要阅读多个页面时,通常会通过跟踪每个页面中的链接来发生礼貌问题。那么最合适的行为是你,人类阅读每个网站上的使用条款,看看他们说你被允许做什么。下一个替代行为是在读取一个页面和读取同一站点上的下一页之间存在延迟。毕竟,人们不会立即从一个页面移动到另一个页面。

您应该知道,如果某个网站判断您的抓取工具是滥用者,该网站可能会暂时拒绝回复您的网址中的任何其他请求。

答案 1 :(得分:0)

延迟读取单个元素实际上会阻塞一个服务器插槽超过必要的时间,所以它是相当不礼貌的行为(虽然意味着礼貌)。正如minopret指出的那样,在单个请求之后暂停并在此期间释放连接可能是对服务器更友好的一种方式。如果您一次只执行一个请求,即使没有延迟,这对任何服务器都不应该是一个问题,但站点策略可能会说其他的。

但更重要的一点是,您应该尊重robots.txt文件并避免抓取那里排除的元素。

此外,您应该发送已收到的Cookie,否则某些网站会针对您提出的每个请求打开新会话。在会话超时之前,这可能会不必要地耗尽资源。