Salvar imagem do google imagens

10 respostas Resolvido
N

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

W

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.

N

Obg mano,vou testar!

N

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.

N

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…

W

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.

N

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

W

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

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

N

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?

W
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