quinta-feira, 4 de agosto de 2016

Download de imagens com JSOUP


Fala galera!

Vamos falar hoje de uma técnica muito legal que você pode utilizar tanto para uso em um projeto pessoal quanto para uma necessidade específica. 



Vou tentar exemplificar: em algum momento você precisou salvar várias imagens de um mesmo site - respeitando os direitos de cópia e uso - e precisou ficar baixando imagem por imagem? Pois bem, o que faremos aqui é uma forma de automatizar esses downloads deixando a tarefa mais rápida e fácil.

Logicamente, o código varia de site para site, então o que compartilharei com vocês é apenas um exemplo simples. Caso tenha interesse em aplicar em algo mais robusto, por favor, compartilhe com a gente :).

Vamos lá! Para fazer esse exemplo para vocês, vou usar um site simples, porém muito conhecido o www.pudim.com.br. Se você não conhece, vale a pena conferir rsrsrs. E também utilizaremos da técnica Web Scraping, onde já falamos em outros posts.

Bom, além de criar a classe que irá receber o código, é muito interessante que você dê uma olhada na estrutura da página, analisando onde estão - em quais tags, classes e ids - das imagens que deseja baixar. Veja como está localizada a imagem que baixaremos:



Nosso código inicial será para encontrar a imagem no site e obter a url/nome do arquivo para que possamos efetuar o download.

//url do site onde está a imagem
public static final String SITE = "http://www.pudim.com.br";
//diretório onde a imagem será salva
public static final String PATH = "E:\\imagens\\";
 
public static void main(String[] args) {   
 
 try{   
  Document doc = Jsoup.connect(SITE).timeout(0).get();
  
  String img = doc.select("div.image").select("img").attr("src");

  //envia o nome da imagem no site ao método
  downloadImage(img);
  
 }catch(Exception ex){
  ex.printStackTrace();
 }   
}

Uma atenção especial para o método timeout(), pois é responsável por definir o tempo de conexão e leitura do site. Por padrão - caso seja omitido o método - o tempo máximo é de 3000 milisegundos (3 segundos), se definir o timeout com 0, ele será tratado como timeout infinito. Quando o tempo limite for excedido, será lançada uma exceção IOException.

//definido timeout 0
Document doc = Jsoup.connect(SITE).timeout(0).get();

Temos um método chamado downloadImage(String img) que será responsável por baixar a imagem e salvar no diretório de destino.

private static void downloadImage(String img) throws IOException{
  
 //nome do arquivo que será salvo no pc
 //nesse caso, adiciona a extensão
 String nome = "imagem.jpg";

 // url = http://www.pudim.com.br/pudim.jpg
 URL url = new URL(SITE+"/"+img);
 InputStream input = url.openStream();
 
 OutputStream output = new BufferedOutputStream(new FileOutputStream(PATH + nome));
 
 for(int i; (i = input.read()) != -1;){
  output.write(i);
 }
 //encerra as conexões
 output.close();
 input.close();
}

Após o download, a imagem estará disponível no diretório informado.

Essa foi a dica de hoje, espero que tenham gostado. Se tiver alguma informação a acrescentar ou alguma curiosidade para compartilhar, fale para nós nos comentários.

Até mais!

;)
Renan Rodrigues Ramos Desenvolvedor

Sou desenvolvedor, amo desenvolvimento de software, músico e apaixonado por filmes e seriados.