2013-09-07 1 views
1

Это совершенно легко download all images from a website using wget.Загрузить все изображения, как wget делает с Java на стороне клиента

Но мне нужна эта функция на стороне клиента, лучше всего на Java.

Я знаю, что источник wget доступен в Интернете, но я не знаю ни одного C, а источник довольно сложный. Конечно, у wget есть и другие функции, которые «взорвали источник» для меня.

Как у Java есть встроенный HttpClient, но я не знаю, насколько изощренным является wget на самом деле, не могли бы вы рассказать мне, сложно ли повторно реализовать функцию «загрузить все изображения рекурсивно» в Java?

Как это делается, точно? Получает ли wget исходный код HTML данного URL-адреса, извлекает все URL-адреса с указанными окончаниями файлов (.jpg, .png) из HTML и загружает их? Он также ищет изображения в таблицах стилей, которые связаны в этом документе HTML?

Как вы это сделаете? Будете ли вы использовать регулярные выражения для поиска (как относительных, так и абсолютных) URL-адресов изображений в документе HTML, и пусть HttpClient загрузит каждый из них? Или уже есть какая-то библиотека Java, которая делает что-то подобное?

+1

Возможно, вы захотите взглянуть на [Джерри] (http://jodd.org/doc/jerry/). Он предоставляет JQuery как селектор для документов HTML, и это может помочь вам найти все загружаемые изображения. –

+0

Если вы знакомы с wget. почему вы не используете wget в java? Я имею в виду написать простой класс java, который вызовет скрипт, который будет содержать ваш wget! – Krishna

+0

@ Кришна: Я выполняю эту задачу для двух программ, которые работают на Android и один на Windows, где у меня нет доступа к wget, к сожалению. Вот почему мне нужно чистое решение Java, не вызывая никаких внешних программ. – caw

ответ

2

В Java можно использовать Jsoup библиотеки для разбора любой веб-странице и извлечь все, что вы хотите

+1

Спасибо, Jsoup выглядит неплохо, хотя он позволяет вам находить теги 'img', что является лишь небольшой частью соскабливания всех изображений. – caw

-1

Найдено this program, который скачивает изображения. Это с открытым исходным кодом.

Вы можете получить изображения на веб-сайте, используя теги <IMG>. Посмотрите на следующий вопрос. Это может помочь вам. Get all Images from WebPage Program | Java

+0

Спасибо! Хотя «Java Image Downloader» (первая ссылка), похоже, не является решением, «HtmlUnit» кажется довольно интересным. Однако он не будет получать фоновые изображения и изображения, связанные с таблицами стилей, тогда как wget делает это. – caw

+0

К сожалению, 'HtmlUnit' имеет множество зависимостей и, следовательно, размер около 12 МБ (без источников). Я уверен, что есть более легкие библиотеки. – caw

0

Для меня crawler4j была библиотека с открытым исходным кодом для рекурсивного обхода (и повторить) сайт, например как это (их QuickStart пример): (он также 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()); 
     } 
    } 
} 

Более webcrawlers и HTML парсеры можно найти here.

+0

Одна проблема, с которой я столкнулся с 'wget', заключалась в том, что мне нужно использовать опции« --regex-ignore »и« --regex-accept », а мои регулярные выражения довольно сложны и проверяют его (регулярные выражения) на консоли это боль в а ...они, похоже, работают иначе, чем синтаксический анализ 'sed' или' sed -e' regexp, и, кроме того, я ненавижу избегать всех знаков '() +' и т. д., что делает их более нечитаемыми и отличается от стиля, который он работает в Java Синтаксис шаблонов. –

Смежные вопросы