给定一个url链接,我想以html格式获取页面的内容。在Java中,我知道我可以用getInputStream
方法实现它。
问题是,现在我有数百万个网址。并希望获得它们的html页面。如果我仍然使用getInputStream
。这很耗时且性能很差。所以我想加快抓取页面的过程。
希望获得有效的方法和高速度。
提前致谢!
答案 0 :(得分:1)
大量抓取一百万个网址是一项棘手的工作。一方面,使用线程池(Executors.newFixedThreadPool(100)
)和Apache Http Clients池很容易。但是,即使运行此代码的中速系统也可以在服务器上完全拒绝服务附加 - 向特定服务器发送大量请求,这些服务开始崩溃。
诀窍是如何限制你的线程,以便它们不会以相同的速率向同一个服务器(甚至可能是同一个C类)发出请求以淹没它们。一种方法是让一个线程做名称 - > IP分辨率因此它可以以测量的方式将URL添加到要被蜘蛛网的队列中。例如,谷歌每分钟就会在网站上播放一个网址。它们下降到一秒,显示他们的蜘蛛技术在安排下载方面有多好。但是有一些中等难度的线程和队列逻辑可以使它正确。
我认为最好的方法是使用[希望]已经解决了这个问题的现有技术。以下是一些可能会引导您进入现有实施的链接。
答案 1 :(得分:0)
我建议使用一些开源网络抓取工具,例如Crawler4j或Apache Nutch。只需导入所有网址作为抓取工具的种子,并设置深度= 1。
Crawler4j是一款轻量级网络爬虫,为用户提供非常简单的界面。将Crawler4j与您的应用程序集成非常容易。
与Crawler4j相比,Nutch非常复杂。学习和定制荷兰需要更多时间
如果您想自己抓取它,Apache HTTP Client是一个不错的选择。许多网络抓取工具都基于它。要礼貌,请在一秒钟内限制您的请求数量,这有助于您避免拒绝服务问题。