【问题标题】:Download all images like wget does with Java on client-side像 wget 在客户端使用 Java 一样下载所有图像
【发布时间】:2013-09-07 16:07:53
【问题描述】:

download all images from a website using wget 非常简单。

但我需要在客户端使用此功能,最好是在 Java 中。

我知道wget的源码可以在线获取,但是我不会C,源码比较复杂。当然,wget 还有其他一些对我来说“炸毁源代码”的功能。

由于Java内置了HttpClient,但我不知道wget到底有多复杂,你能告诉我在Java中重新实现“递归下载所有图像”功能是否很难?

这到底是怎么做的? wget 是否获取给定 URL 的 HTML 源代码,从 HTML 中提取具有给定文件结尾(.jpg、.png)的所有 URL 并下载它们?它是否也在该 HTML 文档中链接的样式表中搜索图像?

你会怎么做?您是否会使用正则表达式在 HTML 文档中搜索(相对和绝对)图像 URL,并让HttpClient 下载每个 URL?还是已经有一些 Java 库可以做类似的事情?

【问题讨论】:

  • 您可能想看看Jerry。它为 HTML 文档提供类似 JQuery 的选择器,它可以帮助您找到所有要下载的图像。
  • 如果你熟悉 wget。你为什么不在java中使用wget?我的意思是编写一个简单的 java 类,它将调用一个脚本,该脚本将包含你的 wget!
  • @Krishna:我正在为两个程序执行此任务,一个在 Android 上运行,一个在 Windows 上运行,不幸的是我无法访问 wget。这就是为什么我需要一个纯 Java 解决方案,而不需要调用任何外部程序。
  • @C.Trimble:谢谢,Jerry 看起来确实很酷,很适合放在工具箱里 :)

标签: java html wget apache-httpclient-4.x


【解决方案1】:

在 Java 中,您可以使用 Jsoup 库来解析任何网页并提取您想要的任何内容

【讨论】:

  • 谢谢,Jsoup 看起来不错,虽然它只能让你找到img 标签,这只是抓取所有图像的一小部分。
【解决方案2】:

对我来说,crawler4j 是递归爬取(和复制)网站的开源库,例如像这样(他们的快速入门示例): (它也是supports CSS URL crawling

public class MyCrawler extends WebCrawler {

    private final static Pattern FILTERS = Pattern.compile(".*(\\.(css|js|gif|jpg"
                                                           + "|png|mp3|mp3|zip|gz))$");

    /**
     * This method receives two parameters. The first parameter is the page
     * in which we have discovered this new url and the second parameter is
     * the new url. You should implement this function to specify whether
     * the given url should be crawled or not (based on your crawling logic).
     * In this example, we are instructing the crawler to ignore urls that
     * have css, js, git, ... extensions and to only accept urls that start
     * with "http://www.ics.uci.edu/". In this case, we didn't need the
     * referringPage parameter to make the decision.
     */
     @Override
     public boolean shouldVisit(Page referringPage, WebURL url) {
         String href = url.getURL().toLowerCase();
         return !FILTERS.matcher(href).matches()
                && href.startsWith("http://www.ics.uci.edu/");
     }

     /**
      * This function is called when a page is fetched and ready
      * to be processed by your program.
      */
     @Override
     public void visit(Page page) {
         String url = page.getWebURL().getURL();
         System.out.println("URL: " + url);

         if (page.getParseData() instanceof HtmlParseData) {
             HtmlParseData htmlParseData = (HtmlParseData) page.getParseData();
             String text = htmlParseData.getText();
             String html = htmlParseData.getHtml();
             Set<WebURL> links = htmlParseData.getOutgoingUrls();

             System.out.println("Text length: " + text.length());
             System.out.println("Html length: " + html.length());
             System.out.println("Number of outgoing links: " + links.size());
         }
    }
}

更多网络爬虫和 HTML 解析器可以在here找到。

【讨论】:

  • 我对@9​​87654325@ 的一个问题是,我必须使用--regex-ignore--regex-accept 选项,而且我的正则表达式非常复杂,在控制台上测试它(正则表达式)是一个痛苦......他们似乎与sedsed -e正则表达式解析不同,另外我讨厌逃避所有()+等标志,这使得它们更加难以阅读,并且与风格不同它适用于 Java 模式语法。
【解决方案3】:

找到下载图片的this program。它是开源的。

您可以使用&lt;IMG&gt; 标签获取网站中的图像。看看下面的问题。它可能会帮助你。 Get all Images from WebPage Program | Java

【讨论】:

  • 谢谢!虽然“Java Image Downloader”(第一个链接)似乎不是解决方案,但“HtmlUnit”似乎很有趣。但是,它不会检索背景图像和样式表中链接的图像,而 wget 会这样做。
  • 不幸的是,HtmlUnit 有很多依赖项,因此大小约为 12MB(无源)。我敢肯定还有更多的轻量级库。
猜你喜欢
  • 2022-06-14
  • 1970-01-01
  • 2013-12-05
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
相关资源
最近更新 更多