2009-03-19 9 views
0

Webページをダウンロードするプログラムを実行する必要があります。つまり、ソフトウェアにWebページを渡し、Webサイト内のすべてのファイルをダウンロードします。Java並行再帰的Webサイトのダウンロード

私は、深さのレベル、つまり、ソフトウェアがウェブサイトの各ファイルをダウンロードするレベルも渡します。

私はこのソフトウェアをJavaで開発し、並行性も使用する必要があります。

どうすればいいですか?

ありがとうございます。


皆さん、ありがとうございました。

もう1つ質問する必要があります。ウェブサイトからファイルをダウンロードするにはどうしたらいいですか?

タクスもう一度。 = D

+1

なぜJavaでこれを行う必要がありますか? wgetやcurlのようなものがたくさんあるときに、なぜこれを行うための新しいプログラムを書く必要がありますか? – Elijah

答えて

2

非常に有用なクモとボットのライブラリ:htmlunit

+0

この種のことをするためのライブラリがたくさんありますが、htmlunitは常にtagsoup(html)やxom(xml)のような別のパーサと組み合わされています。 – lucas

0

これは、あなたが必要とする詳細なガイダンスがわからなければ少し難解ですが、ここで概要を説明します。 :)

Javaでは、HTTPリクエストとスレッド化の両方が容易に利用できるため、このようなアプリケーションは非常に簡単になります。私の解決策には、新しいURLを含むグローバルスタックと、スタックから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

0

私はJava Executorsパッケージを見ているでしょう。一連のタスク(Runnable)を作成し、適切なExecutorに渡します。 Futureが返され、その結果を照会することができます。

Executorは、このRunnableの実行時に調整します。単一スレッドエグゼキュータ、スレッドプールなどのエグゼキュータのための実装が存在するので、(あまりにも)心配する必要はありません。スレッドの複雑さ。並行性ユーティリティーがこれを見てくれます。

Apache HTTP Clientは、あなたに照会するHTTPを調べます。