Multithreading 如何获取数百万URL链接的html内容

Multithreading 如何获取数百万URL链接的html内容,multithreading,web-crawler,Multithreading,Web Crawler,给定一个url链接,我希望以html格式获取页面内容。在Java中,我知道我可以使用getInputStream方法实现这一点 问题是,现在我有数百万个URL。并且想要得到他们的html页面。如果我仍然使用getInputStream。这很耗时,而且性能很差。因此,我想加快获取页面的过程 希望能得到高效的方法和高速的速度来做到这一点 提前谢谢 对一百万个URL进行大规模爬网是一件棘手的事情。一方面,很容易使用线程池(Executors.newFixedThreadPool(100))和线程池。然

给定一个url链接,我希望以html格式获取页面内容。在Java中,我知道我可以使用
getInputStream
方法实现这一点

问题是,现在我有数百万个URL。并且想要得到他们的html页面。如果我仍然使用
getInputStream
。这很耗时,而且性能很差。因此,我想加快获取页面的过程

希望能得到高效的方法和高速的速度来做到这一点


提前谢谢

对一百万个URL进行大规模爬网是一件棘手的事情。一方面,很容易使用线程池(
Executors.newFixedThreadPool(100)
)和线程池。然而,即使是运行此代码的中速系统,也可以完全在服务器上执行拒绝服务连接——向特定服务器发送如此多的请求,导致服务器崩溃

诀窍是如何限制线程,使它们不会以如此快的速度向同一台服务器(甚至可能是同一个C类)发出请求以压倒它们。一种方法是让一个线程执行name->IP解析,这样它就可以以一种可测量的方式将url添加到要spidered的队列中。例如,谷歌(Google)会在一分钟内抓取一个小网站的URL。他们只剩下一秒钟,这表明他们的蜘蛛技术在安排下载方面有多么出色。但是有一些中等强度的线程和队列逻辑可以使它正确

我认为最好的方法是使用现有技术,希望这些技术已经解决了这个问题。下面是一些链接,可以引导您找到现有的实现

  • @安德烈亚斯提到了一个问题,我相信还有其他问题
  • 这是一个sun项目
  • 这里有一个相关的问题:

我建议使用一些开源的网络爬虫程序,如或。只需将所有URL作为爬虫的种子导入,并将深度设置为1。
Crawler4j是一种轻量级的网络爬虫,为用户提供非常简单的界面。将Crawler4j与您的应用程序集成非常容易。
与Crawler4j相比,Nutch要复杂得多。学习和定制nutch需要更多时间。

如果您想自己获取它,ApacheHTTP客户端是一个不错的选择。许多网络爬虫都是基于它的。礼貌地说,限制一秒钟内的请求数量,这有助于避免拒绝服务问题。

getInputStream
只为我们提供了一个了解代码的小窗口,与性能问题无关。你能展示一下你用来下载页面的类和方法吗?你使用的是apache http客户端,或者Java URL,或者???Gray,我使用的是http客户端,方法是Get。但是我不熟悉http网络编程。我想找到一种更好的方法来下载网页。你有什么好主意吗?看看相关的项目或在网上搜索。对于您的性能问题,此链接看起来很有趣:基本上它使用队列和多个线程来加速爬网。@Andreas谢谢,我将看一看webcrawler。我很感激这个答案。我想这会帮我一个忙。实际上,我只想下载URL链接的页面,然后解析html标记。但是URL的数量非常多。@John Rene,我在你的个人资料中找不到你的电子邮件地址。我想你没有看到我对另一个问题的评论。我正在学习nutch一段时间,很高兴有机会与大家分享我们的想法。