単純化された Web サイト ダウンローダーを構築する必要があります。基本的に、Web サイト内のリンクを調べて、html ファイルをローカル ディレクトリに再帰的にダウンロードします。これに最も適したデータ構造はどれですか? ある種の深さ優先検索アルゴリズムを実装する必要があることはわかっています。私のタスクに適したコア Java のデータ構造ライブラリはありますか?また、コーディングの量を減らすことができますか? (私はJavaが初めてです)ありがとう!
3 に答える
単純化された Web サイト ダウンローダーを構築する必要があります。基本的に、Web サイト内のリンクを調べて、html ファイルをローカル ディレクトリに再帰的にダウンロードします。
これを行うためのコマンド ライン ツールやグラフィカル インターフェイス ツールは多数あります (例: wget )。
これに最も適したデータ構造はどれですか? ある種の深さ優先検索アルゴリズムを実装する必要があることはわかっていますが、私のタスクに適した Java のコアにデータ構造ライブラリがあり、コーディングの量を減らすことができますか? (私はJavaが初めてです)ありがとう!
データ構造とアルゴリズムは 2 つの異なるものです。目的に最適なデータ構造とアルゴリズムは、データの規模やその他の要因によって異なります。これが少数のリンクをクロールする小さなアプリケーションである場合は、再帰的な方法を使用して各ページをダウンロードし、次のダウンロードのためにリンクのページを解析することをお勧めします。
大規模な Web クローラーの場合は、おそらくMapReduceと、データの保存とダウンロードを同時に行うためのいくつかの分散型アプローチを検討することをお勧めします。
便利なツールは次のとおりです。
- Apache 共通 IO、FileUitls.copyURLToFile関数
- Apache 共通http クライアント
- HTMLを解析するためのJsoup
次の 2 つの方法が役立つと思います。リンクの String 配列を指定すると、ルート ディレクトリのすべてのページがダウンロードされます。ページをダウンロードするだけの場合は、このコードが部分的に役立ちます。
public static void downloadPage(String[] pageLink) {
URL url;
InputStream is = null;
DataInputStream dis;
String line;
StringBuilder builder = new StringBuilder();
builder.append("");
try {
for (int i = 0; i < pageLink.length; i++) {
url = new URL(pageLink[i]);
is = url.openStream();
dis = new DataInputStream(new BufferedInputStream(is));
while ((line = dis.readLine()) != null) {
builder.append(line + "\n");
}
savePage(i + ".html", builder.toString());
builder.setLength(0);
}
} catch (MalformedURLException mue) {
mue.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
try {
is.close();
} catch (IOException ioe) {
}
}
}
public static void savePage(String fileName, String text) {
PrintStream out = null;
try {
out = new PrintStream(new FileOutputStream(fileName));
out.print(text);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (out != null)
out.close();
}
}
他の提案に加えて、ExecutorServiceとJava Concurrencyを確認することもできます。おそらく、ダウンロードをスレッド化して高速化する必要があるからです。