从存储库下载tarball

时间:2011-05-22 00:39:04

标签: java download web-scraping wget sourceforge

我目前正在开发一个从SourceForge中抓取源代码的项目。 我想从代码库下载tarball。

下面给出了一个示例链接: http://wurfl.cvs.sourceforge.net/viewvc/wurfl/?view=tar

我下载时遇到的问题是,我无法使用传统的URLConnection,HttpClient,HtmlUnit,Jsoup等API来下载文件。指定的链接不包含任何文件名或扩展名,这使下载过程更加复杂。

你能建议一种方法,给定一组tarball链接作为参数,我应该能够将它们下载到我的磁盘吗?此外,我能够使用wget下载它。有没有办法在Windows中以Java编程方式?

2 个答案:

答案 0 :(得分:3)

在您继续努力之前,请仔细阅读Sourceforge Terms of Use页面。如果您不理解ToS,请联系Sourceforge并询问他们您是否被允许按照您的建议行事。


  

我下载时遇到的问题是,我无法使用传统的url,http,htmlunit,jsoup apis等来下载文件。

您的假设不正确。

您可以使用标准HttpURLConnection API或Apache HttpClient API等API来执行此类操作。如果它不起作用,那是因为

  • 您正在以错误的方式执行某些操作(例如,您尚未将Java应用程序配置为使用本地HTTP代理),或
  • Sourceforge正在使用一些技术手段阻止你这样做;见ToS。

如果您在尝试这些方法时发布了有关正在发生的事情的一些细节,也许我们可以帮助您。

(HtmlUnit和Jsoup可能不合适,因为它们的目标是HTML内容。)

  

指定的链接不包含任何文件名或扩展名,这使下载过程更加复杂。

您可以从响应标头中获取源文件名和/或内容类型。有关详细信息,请参阅HTTP规范。

答案 1 :(得分: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,除非你自己的代码是你正在抓的(我曾经做过一次作为更新程序)。如果你这样做,我的例子有所帮助,请不要提及我。 =]

希望我帮忙!