【问题标题】:Java concurrent recursive website downloadJava并发递归网站下载
【发布时间】:2009-03-19 10:48:31
【问题描述】:

我需要做一个程序来下载网页,即我给软件一个网页,它会下载网站中的所有文件。

我还会通过一个深度级别,即软件下载网站每个文件的级别。

我会用 Java 开发这个软件,我也需要使用并发。

请告诉我你对如何做到这一点的看法。

感谢您的帮助。


感谢大家的帮助。

我还需要问一件事。如何从网站下载文件?

再来一次。 =D

【问题讨论】:

  • 为什么需要在 Java 中执行此操作?既然有很多像 wget 或 curl 这样的程序,为什么还要编写一个新程序来执行此操作?

标签: java concurrency


【解决方案1】:

一个非常有用的蜘蛛和机器人库:htmlunit

【讨论】:

  • 虽然有大量的库可以做这种事情,但 htmlunit 也一直是我的最爱,也许可以与 tagoup (html) 或 xom (xml) 等不同的解析器结合使用。
【解决方案2】:

嗯,如果不知道您需要多么详细的指导,这有点难以回答,但这里有一个概述。 :)

实际上,Java 使此类应用程序变得非常容易,因为 HTTP 请求和线程都可以轻松使用。我的解决方案可能涉及一个包含新 url 的全局堆栈,以及从堆栈中弹出 url 的恒定数量的线程场。我会将网址存储为自定义对象,以便跟踪深度。

我认为您的主要问题在于没有响应或不遵循 HTTP 标准的网站。我在类似的应用程序中多次注意到,有时这些应用程序不会正确超时,最终它们最终会阻塞所有线程。不幸的是,我在这里没有任何好的解决方案。

一些有用的类作为起点:
http://java.sun.com/javase/6/docs/api/java/lang/Thread.html
http://java.sun.com/javase/6/docs/api/java/lang/ThreadGroup.html
http://java.sun.com/javase/6/docs/api/java/net/URL.html
http://java.sun.com/javase/6/docs/api/java/net/HttpURLConnection.html

【讨论】:

    【解决方案3】:
    【解决方案4】:

    我会看看Java Executors 包。您创建一组任务 (Runnables) 并将它们传递给合适的选择执行器。你会得到一个Future,然后你可以查询它的结果。

    Executor 将在执行此 Runnable 时进行协调。单线程执行器、具有线程池的执行器等都有实现。所以你不需要担心(太多)wrt。线程的复杂性。并发实用程序将为您处理此问题。

    Apache HTTP Client 将为您处理 HTTP 查询。

    【讨论】:

      猜你喜欢
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-14
      相关资源
      最近更新 更多