Salvar imagem do google imagens

10 respostas Resolvido
natan_guj_natan

Bom dia a todos, da pra baixar imagens do google imagens com java. Queria baixar o(s) primeiro(s) resultado(s) referente um termo que vou pesquisa, pelo java ao invés de ser pelo navegador…

10 Respostas

wldomiciano

Eu acredito que o jeito mais fácil é usando a biblioteca jsoup. Ficaria algo assim:

import java.awt.image.BufferedImage;
import java.io.InputStream;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

public class App {
  private static void showImage(String query) throws Exception {
    Document doc = Jsoup.connect("https://www.google.com/search?source=lnms&tbm=isch&q=" + query).get();

    Element image = doc.select(".Q4LuWd[data-src]").first();

    URL url = new URL(image.attr("data-src"));

    try (InputStream is = url.openStream()) {
      BufferedImage img = ImageIO.read(is);

      JLabel label = new JLabel(new ImageIcon(img));

      String title = "Imagem sobre " + query;

      JOptionPane.showConfirmDialog(null, label, title, JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE);
    }
  }

  public static void main(String... args) throws Exception {
    showImage("kitten");
  }
}

Eu fiz este projetinho simplesinho usando Gradle, olha:

teste-com-jsoup.zip (1,KB)

Se vc já tiver o Gradle instalado, é só rodar com o comando gradle run.

natan_guj_natan

Obg mano,vou testar!

natan_guj_natan

Sou iniciante, baixei a biblioteca do link e copiei o código, mas excutou com erro, como faço para utilizar esse gradle,(atualmente uso o apache netbeans).Não sei extamente o que é um projeto gadle e como criar um.

natan_guj_natan

C:\Users\natan\AppData\Local\NetBeans\Cache\12.4\executor-snippets\junit.xml:184: The following error occurred while executing this line:
C:\Users\natan\AppData\Local\NetBeans\Cache\12.4\executor-snippets\junit.xml:128: The or for must include junit.jar if not in Ant’s own classpath
BUILD FAILED (total time: 0 seconds)

apresentou esse erro no netbeans…

wldomiciano

De Netbeans eu não entendo, mas pela mensagem parece estar relacionada com o JUnit. Tenta criar um novo projeto para ver se o erro persiste.

natan_guj_natan

Deu certo, e como faria para pegar mais de um resultado e gravar no disco ?

wldomiciano

Seria algo assim:

import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.stream.Collectors;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

public class App {
  private static void showImage(String query, int quantity) throws Exception {
    Document doc = Jsoup.connect("https://www.google.com/search?source=lnms&tbm=isch&q=" + query).get();

    List<Element> images = doc.select(".Q4LuWd[data-src]").stream().limit(quantity).collect(Collectors.toList());

    int count = 0;

    for (Element image : images) {
      URL url = new URL(image.attr("data-src"));

      System.out.println(image.attr("data-src"));

      try (InputStream is = url.openStream()) {
        Files.write(Path.of("image" + ++count + ".jpg"), is.readAllBytes());
      }
    }
  }

  public static void main(String... args) throws Exception {
    showImage("kitten", 3);
  }
}
natan_guj_natan

Funcionou perfeitamente, uma dúvida. O metodo “Files.white” converte todas as imagens em jpg, ou procura as nesse formato?

natan_guj_natan

Fiz uma lista para download, alguns resultados ele pula, “7896496972609” tipo essa pesquisa, se pesquisa no google imagens aparecem varios, mas no código não retorna nada… O que seria?

wldomiciano
Solucao aceita

Quando vc pesquisa por “7896496972609” o resultado vem diferente. As imagens vêm dentro do JavaScript da página como Base64, aí o jeito de lidar com isso é diferente. Eu consegui assim:

import java.io.ByteArrayInputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Base64;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

import javax.imageio.ImageIO;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

public class App {
  private static void showImage(String query, int quantity) throws Exception {
    Document doc = Jsoup.connect("https://www.google.com/search?source=lnms&tbm=isch&q=" + query).get();

    List<String> images = // @formatter:off
      doc
        .select("script[nonce]")
        .stream()
        .map(Element::html)
        .filter(text -> text.contains("_setImgSrc("))
        .flatMap(text -> Pattern.compile("'data:image\\\\/jpeg;base64,([^,']*)'").matcher(text).results())
        .map(result -> result.group(1).replaceAll("\\\\/", "/").replaceAll("\\\\x3d", "="))
        .limit(quantity)
        .collect(Collectors.toList()); // @formatter:on

    int count = 0;

    String format = "jpg";

    for (String image : images) {
      Path path = Path.of("image" + ++count + "." + format);

      try ( //
          ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64.getDecoder().decode(image)); //
          OutputStream outputStream = Files.newOutputStream(path) //
      ) {
        ImageIO.write(ImageIO.read(inputStream), format, outputStream);
      }

      System.out.println(image + '\n');
    }
  }

  public static void main(String... args) throws Exception {
    showImage("7896496972609", 3);
  }
}

Na variável format eu testei com “jpg”, “png” e “gif” e todos deram certo.

Criado 12 de setembro de 2021
Ultima resposta 15 de set. de 2021
Respostas 10
Participantes 2