Salvar imagem do google imagens

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…

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.

2 curtidas

Obg mano,vou testar!

1 curtida

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.

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…

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.

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

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);
  }
}

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

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?

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.