1

私は現在、SourceForge からソース コードをスクレイピングするプロジェクトに取り組んでいます。コード リポジトリから tarball をダウンロードしたいと思います。

リンクの例を以下に示します: http://wurfl.cvs.sourceforge.net/viewvc/wurfl/?view=tar

ダウンロード中に直面した問題は、従来の URLConnection、HttpClient、HtmlUnit、Jsoup などの API を使用してファイルをダウンロードできないことです。指定されたリンクにはファイル名や拡張子が含まれていないため、ダウンロード プロセスがさらに複雑になります。

一連の tarball リンクをパラメーターとして与えられた場合に、それらをディスクにダウンロードできるようにする方法を提案できますか? また、wget を使用してダウンロードすることもできました。WindowsのJavaでプログラムでそれを行う方法はありますか?

4

2 に答える 2

3

作業を進める前に、Sourceforge利用規約のページをよくお読みください。ToS を理解していない場合は、Sourceforge に連絡して、あなたが提案していることを実行できるかどうか尋ねてください。


ダウンロード中に直面した問題は、従来の URL、http、htmlunit、jsoup API などを使用してファイルをダウンロードできないことです。

あなたの仮定は間違っています。

標準HttpURLConnectionAPI や Apache HttpClientAPI などの API を使用して、このようなことを行うことができます。それが機能していない場合、その理由は次のとおりです。

  • 何か間違った方法で実行している (たとえば、ローカル HTTP プロキシを使用するように Java アプリを構成していない)、または
  • Sourceforge は、あなたがこれを行うのを阻止するためにいくつかの技術的手段を使用しています。ToS を参照してください。

これらのアプローチを試したときに何が起こっているかについて詳細を投稿していただければ、私たちがお手伝いできるかもしれません.

(HtmlUnit と Jsoup は、HTML コンテンツを対象としているため、おそらく不適切です。)

指定されたリンクにはファイル名や拡張子が含まれていないため、ダウンロード プロセスがさらに複雑になります。

応答ヘッダーからソース ファイル名および/またはコンテンツ タイプを取得できます。詳細については、HTTP 仕様を参照してください。

于 2011-05-22T03:05:37.640 に答える
1

本当に SourceForges の ToS に違反したい場合は、これが役立つかもしれません。

必要に応じて、wget.exe が必要です。

ProcessBuilder pb = new ProcessBuilder("wget.exe","http://wurfl.cvs.sourceforge.net/viewvc/wurfl/?view=tar", "no-proxy");
Process p = pb.start();

これは、wget.exe がクラス ファイルと同じディレクトリにある限り機能します。

ファイルが存在するかどうかを確認することもできます。その場合、次の行の中で何かを行います。

ProcessBuilder pb = new ProcessBuilder("wget.exe","http://wurfl.cvs.sourceforge.net/viewvc/wurfl/?view=tar", "no-proxy");
       Process p = pb.start();
       int exitValue = p.waitFor();
       BufferedReader reader;
       // System.out.println("Exit Value" + exitValue);
       if (exitValue == 0) {
               reader = new BufferedReader(new InputStreamReader(p
                               .getInputStream()));
       } else {
               reader = new BufferedReader(new InputStreamReader(p
                               .getErrorStream()));
       }
       StringBuffer sb = new StringBuffer();
       String temp = reader.readLine();
       while (temp != null) {
               sb.append(temp);
               temp = reader.readLine();
       }

       reader.close();
       System.out.println(sb.toString());
if(sb.toString().indexOf("404") != -1) {
//means that the file does not exist
System.out.println("File does not exist, or access is denied");
} else {
if(sb.toString().indexOf("200") != -1) {
//file exists, download it
System.out.println("File exists, downloading...");
ProcessBuilder pb = new ProcessBuilder("wget.exe","http://wurfl.cvs.sourceforge.net/viewvc/wurfl/?view=tar", "no-proxy");
    Process p = pb.start();
}

ただし、自分のコードをスクレイピングする場合を除き、SourceForge をスクレイピングしないことをお勧めします (アップデーター プログラムとして 1 回実行しました)。もしそうなら、そして私の例が役に立ちますが、親切に私に言及しないでください. =]

私が助けてくれることを願っています!

于 2012-03-20T22:36:30.680 に答える