【问题标题】:Download tarball from repository从存储库下载 tarball
【发布时间】:2011-05-22 00:39:03
【问题描述】:

我目前正在从事一个从 SourceForge 抓取源代码的项目。 我想从代码库下载压缩包。

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

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

您能否建议一种方法,通过将一组 tarball 链接作为参数,我应该能够将它们下载到我的磁盘上?另外,我可以使用 wget 下载它。有没有办法我可以在 Windows 中的 Java 中以编程方式做到这一点?

【问题讨论】:

  • 为什么不能使用标准Java库下载文件?至于文件名,只需给它一个随机名称和一个.tar 扩展名。您可以使用以下命令生成随机文件名:Long.toHexString(Double.doubleToLongBits(Math.random())); (source)。
  • 另见terms of use
  • 您能否具体说明为什么无法使用“常规 url、http、htmlunit、jsoup apis 等”下载文件?共享失败的代码将帮助任何人更好地了解您的问题。
  • 顺便说一下,文件名存在于响应的 Content-Disposition 标头中(对于提供的链接)。您需要解析此标头以获取所需的文件名(浏览器也会在“保存文件”对话框中显示该文件名)。

标签: java download web-scraping wget sourceforge


【解决方案1】:

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


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

你的假设不正确。

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

  • 您做错了事(例如,您尚未将 Java 应用配置为使用本地 HTTP 代理),或者
  • Sourceforge 正在使用一些技术手段阻止您这样做;请参阅服务条款。

如果您发布一些有关尝试这些方法时发生的情况的详细信息,也许我们可以为您提供帮助。

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

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

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

【讨论】:

    【解决方案2】:

    如果您确实想违反 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,除非您正在抓取您自己的代码(我曾经作为更新程序这样做过)。如果你这样做了,我的例子有帮助,请不要提及我。 =]

    希望我能帮上忙!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-10
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 2014-06-14
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多