De volta ao blog

Raspagem de Dados na Web com Java: Jsoup, Playwright e Fluxos de Trabalho com Navegador na Nuvem

Ava Wilson
Ava Wilson

Expert in Web Scraping Technologies

10-Oct-2026

TL;DR:

  • Jsoup analisa o HTML fornecido a ele. Ele não executa o JavaScript da página para criar registros ausentes.
  • Playwright Java fornece um caminho de aquisição via navegador. O HTML renderizado pode alimentar o mesmo contrato de extração Jsoup usado para uma página estática.
  • Agent Browser move a execução do navegador para a nuvem. O Java ainda é responsável pelos seletores, validação de registros, escopo de paginação e exportação.
  • Um arquivo CSV só é útil quando seus registros identificam a fonte pretendida. Preserve IDs de registro estáveis e URLs resolvidas, e rejeite campos obrigatórios ausentes.

A raspagem web em Java começa com uma pergunta prática: o HTML do servidor já contém os registros ou é necessário que um navegador os crie? Escolher corretamente o caminho de aquisição evita escrever um seletor para um documento que nunca conteve os dados.

Este fluxo de trabalho usa Jsoup para extração e Playwright Java para aquisição de páginas renderizadas. Ambos os caminhos produzem o mesmo formato de registro. Uma conexão dedicada de Scrapeless Agent Browser é a opção em nuvem quando a carga de trabalho do navegador deve ser executada fora do host da sua aplicação.

Os exemplos têm como alvo uma listagem de artigos controlada com atributos estáveis. Substitua esse contrato somente depois de inspecionar sua fonte permitida. Compilação Java e execução de navegador exigem o runtime e as credenciais listados abaixo; nenhuma captura Java em tempo real é reivindicada neste guia.

Escolha Jsoup quando os registros necessários estiverem presentes no HTML recuperado. Escolha um navegador quando a página permitida exigir JavaScript ou interação antes de esses registros existirem.

Path HTML fornecido ao parser Tarefa inicial adequada Responsabilidade que você mantém
Jsoup HTTP fetch Documento retornado pelo servidor Listagem estática de artigos ou catálogo Inspeção da fonte e extração
Playwright Java local Documento renderizado pelo navegador Desenvolvimento controlado de página dinâmica Runtime do navegador e gerenciamento de recursos
Agent Browser com Playwright Java Documento de navegador em nuvem Um fluxo de trabalho dedicado de navegador remoto Ciclo de vida da conexão, seletores e verificações de saída

Não escolha o caminho com base no framework usado para construir o site. Uma aplicação JavaScript pode servir HTML útil, enquanto uma listagem aparentemente simples pode inserir registros após o carregamento. Inspecione a página específica e os campos necessários.

Semântica de representação HTTP descreve a resposta que um cliente recebe. O estado da página produzido mais tarde por um navegador é uma observação de aquisição diferente.

Pré-requisitos e Dependências

Este projeto precisa de um JDK e Maven, além das dependências Jsoup e Playwright Java. O projeto mostrado tem como alvo o JDK 17; ele fixa Jsoup 1.23.2 e Playwright 1.63.0 em vez de reutilizar versões de um tutorial mais antigo.

Para renderização local, instale o runtime de navegador exigido pela sua versão do Playwright no ambiente do seu próprio projeto. Para renderização remota, obtenha uma conexão dedicada de Agent Browser por meio da configuração de conta atual e mantenha seu endpoint completo em SCRAPELESS_CDP_URL.

O alvo deve ser público ou de outra forma autorizado. TARGET_URL é uma URL de listagem de artigos permitida cuja estrutura você já inspecionou. O contrato de seletores do exemplo é main article[data-id], com um título e um link dentro de cada artigo.

Nota: A cadeia de ferramentas Java, a instalação de dependências e o runtime de navegador são pré-requisitos de execução. Os trechos foram verificados em relação às interfaces atuais das bibliotecas, mas não foram compilados nem executados no ambiente de verificação disponível. O caminho remoto também exige uma conexão real dedicada ao Scrapeless.

Salve esta configuração Maven como pom.xml e a classe abaixo como src/main/java/ArticleCollector.java:

xml Copy
<project xmlns="http://maven.apache.org/POM/4.0.0">
  <modelVersion>4.0.0</modelVersion>
  <groupId>example</groupId>
  <artifactId>article-collector</artifactId>
  <version>1.0.0</version>
  <properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.jsoup</groupId>
      <artifactId>jsoup</artifactId>
      <version>1.23.2</version>
    </dependency>
    <dependency>
      <groupId>com.microsoft.playwright</groupId>
      <artifactId>playwright</artifactId>
      <version>1.63.0</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.10.1</version>
      </plugin>
    </plugins>
  </build>
</project>

Mantenha o alvo do compilador e as versões das dependências neste projeto para que outro ambiente possa reproduzir a configuração antes que qualquer tarefa de coleta seja habilitada.

Configure um Único Contrato de Extração para Ambos os Caminhos

O contrato de extração define um registro de artigo aceito independentemente do transporte. Este exemplo exige um data-id não vazio, um título h2 e um link que resolva para uma URL HTTP ou HTTPS.

Esses são atributos de exemplo controlados, não afirmações sobre os seletores atuais de um site público. Para sua fonte, prefira atributos de registro estáveis ou padrões de URL duráveis quando disponíveis. Não reutilize uma classe decorativa apenas porque ela correspondeu a uma captura.

Mantenha campos obrigatórios e opcionais separados. Um identificador ausente rejeita o registro do exemplo. Um resumo opcional pode continuar ausente sem alterar a identidade do registro. Torne essa política explícita antes de exportar.

Implementação Básica: Buscar, Extrair e Exportar

A classe abaixo adquire HTML por meio do caminho selecionado, extrai registros de artigos com Jsoup e grava um arquivo CSV em UTF-8. Seu ramo remoto usa um endpoint CDP fornecido pela conta em vez de inventar um método Java Scrapeless SDK.

Nota: Este exemplo completo em Java requer as dependências fixadas, JDK, configuração do Maven e um destino permitido. O branch local precisa de um runtime de navegador; o branch remote precisa de SCRAPELESS_CDP_URL. Nenhuma saída abaixo é apresentada como captura de execução ao vivo.

java Copy
import com.microsoft.playwright.*;
import com.microsoft.playwright.options.WaitUntilState;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.net.URI;

public class ArticleCollector {
  private static String csv(String value) {
    return "\"" + value.replace("\"", "\"\"") + "\"";
  }

  public static void main(String[] args) throws Exception {
    if (args.length != 2) throw new IllegalArgumentException("mode and URL required");
    String mode = args[0];
    String target = args[1];
    Document doc;
    if (mode.equals("static")) {
      doc = Jsoup.connect(target).get();
    } else {
      if (!mode.equals("local") && !mode.equals("remote"))
        throw new IllegalArgumentException("Unsupported acquisition mode");
      try (Playwright playwright = Playwright.create()) {
        String endpoint = System.getenv("SCRAPELESS_CDP_URL");
        if (mode.equals("remote") && (endpoint == null || endpoint.isBlank()))
          throw new IllegalArgumentException("Dedicated CDP endpoint required");
        Browser browser = mode.equals("remote")
            ? playwright.chromium().connectOverCDP(endpoint)
            : playwright.chromium().launch();
        try {
          Page page = browser.newPage();
          page.navigate(target, new Page.NavigateOptions()
              .setWaitUntil(WaitUntilState.DOMCONTENTLOADED));
          page.locator("main article[data-id] a[href]").first().waitFor();
          doc = Jsoup.parse(page.content(), page.url());
        } finally {
          browser.close();
        }
      }
    }
    StringBuilder output = new StringBuilder("id,title,url\r\n");
    int accepted = 0;
    for (Element article : doc.select("main article[data-id]")) {
      Element heading = article.selectFirst("h2");
      Element link = article.selectFirst("a[href]");
      String id = article.attr("data-id").strip();
      if (id.isEmpty() || heading == null || link == null) continue;
      String title = heading.text().strip();
      String url = link.attr("abs:href");
      URI resolved = URI.create(url);
      if (title.isEmpty() || resolved.getHost() == null ||
          !("https".equals(resolved.getScheme()) || "http".equals(resolved.getScheme())))
        continue;
      output.append(csv(id)).append(',').append(csv(title)).append(',')
          .append(csv(url)).append("\r\n");
      accepted++;
    }
    if (accepted == 0) throw new IllegalStateException("Content contract not satisfied");
    Files.writeString(Path.of("articles.csv"), output, StandardCharsets.UTF_8);
    System.out.println("Accepted article records: " + accepted);
  }
}

Compile o projeto e copie suas dependências com Maven, depois execute ArticleCollector usando um classpath contendo target/classes e o diretório de dependências. Selecione static, local ou remote e forneça a URL de destino inspecionada.

Nota: Esses comandos de shell POSIX exigem a cadeia de ferramentas Java e as dependências acima. Defina TARGET_URL como a origem permitida. Compilação e coleta continuam sendo pré-requisitos de execução para este exemplo.

bash Copy
mvn -q dependency:copy-dependencies compile
java -cp 'target/classes:target/dependency/*' ArticleCollector static "$TARGET_URL"

Use um ponto e vírgula como separador de classpath em um ambiente Windows. Escolha o modo local ou remote apenas após concluir sua configuração de runtime de navegador ou de sessão dedicada.

O código usa abs:href para que um link relativo seja interpretado em relação ao URL base do documento capturado. relative URI resolution explica por que um caminho por si só não é uma identidade de origem completa. Mantenha o URL da página adquirida separadamente de cada URL de artigo descoberto no manifesto de captura da sua aplicação.

Renderizar uma Página Dinâmica com Playwright Java

O caminho do navegador aguarda por um elemento específico da tarefa antes de coletar o HTML da página. domcontentloaded é o marco de navegação; o localizador do artigo estabelece a condição separada de que os registros do exemplo estão presentes.

Não trate nenhuma das condições como prova de que todos os registros chegaram. Uma listagem pode carregar mais linhas somente após uma ação explícita. Verifique se o primeiro lote está completo para a tarefa solicitada antes de aceitá-lo.

Os métodos de conexão de navegador do Playwright distinguem seu protocolo nativo de CDP. Uma conexão CDP é para navegadores baseados em Chromium e tem capacidades diferentes de uma conexão de protocolo nativo do Playwright.

Mantenha timeouts e condições de prontidão da origem na configuração do projeto ao desenvolver um coletor real. Um marcador visível específico da origem é mais útil do que esperar que tráfego de analytics não relacionado se torne ocioso.

Comece a Fazer Scraping com o Scrapeless

Potencialize seu fluxo de trabalho de web scraping e automação com o Scrapeless!
Inscreva-se hoje e ganhe US$ 5 em crédito gratuito — sem necessidade de cartão de crédito.

Solicite seu crédito gratuito agora no Dashboard do Scrapeless.

Onde Scrapers Java Locais Param

Um parser Java local não consegue fornecer conteúdo renderizado ausente, e um navegador local não remove a necessidade de gerenciar recursos do navegador e o estado de aquisição. Esses limites determinam quando o fluxo de trabalho precisa de um navegador em nuvem.

O Scrapeless Agent Browser fornece a camada de navegador remoto para este fluxo de trabalho Java. Obtenha uma conexão dedicada por meio da configuração do Agent Browser Playwright, depois passe o endpoint de conexão completo para o branch remote.

A URL de conexão pode conter credenciais. Mantenha-a no ambiente de runtime, não a registre em logs e feche apenas a sessão dedicada alocada para este trabalho. Conectar-se a um navegador compartilhado e fechá-lo afetaria outros trabalhos usando essa sessão.

O caminho em nuvem altera onde a aquisição é executada. Ele mantém a mesma análise de HTML e validação de registros em Java. Um documento desafiador ou um estado incorreto de página ainda deve falhar o contrato de conteúdo em vez de produzir uma exportação bem-sucedida.

A paginação deve seguir o contrato de navegação inspecionado da origem e um escopo de coleta limitado. Descubra uma URL de próxima página ou interação permitida a partir da própria origem em vez de adivinhar um parâmetro de número de página.

Preserve a identidade da página atual, o próximo link descoberto e o conjunto de páginas visitadas. Confirme que o link pertence ao escopo de origem aprovado antes de navegar. Pare quando o orçamento de páginas da tarefa for atingido, uma URL repetida aparecer ou a origem estabelecer que nenhuma outra página existe.

A ausência de um próximo link pode significar que a listagem terminou ou que a origem falhou em renderizar sua navegação. Use o conteúdo da página e evidências de estado vazio para distinguir esses resultados. A classe de página única acima deixa deliberadamente essa decisão para a aplicação em vez de implicar um loop de paginação universal.

Exportar e validar os registros

A etapa de exportação deve preservar a identidade dos registros aceitos e codificar corretamente o formato escolhido. As regras de aspas em campos CSV contemplam o tratamento de delimitadores e aspas; o exemplo duplica aspas inseridas e coloca aspas em cada campo.

A sintaxe CSV é separada da validação de conteúdo. Reabra a saída com o analisador (parser) downstream pretendido e verifique campos obrigatórios, identificadores exclusivos e links de origem. Use uma política de importação de planilha que mantenha texto não confiável como dados quando uma pasta de trabalho for o consumidor.

O cabeçalho CSV descreve o contrato: id, title e url. Este é um esquema de exemplo normativo, não um conjunto de dados capturado. Uma origem sem registros correspondentes faz o exemplo parar; ele não rotula silenciosamente esse resultado como uma listagem vazia válida.

Solucionar problemas no limite de aquisição

Registros ausentes devem ser diagnosticados em relação ao documento adquirido e ao contrato de extração. Um CSV vazio por si só não identifica a causa.

Sintoma Inspecionar Ação de engenharia provável
HTML estático não contém os registros necessários Resposta bruta e prontidão da origem Selecionar o caminho de navegador permitido
O navegador renderiza conteúdo não relacionado Página final e estado da página Corrigir a URL inicial ou a interação
Alguns registros não têm IDs ou títulos Marcação da origem e campos obrigatórios Atualizar ou restringir o contrato
Links relativos são exportados incorretamente URL base capturada e atributos de link Resolver links em relação ao documento correto
A conexão remota não pode ser estabelecida Tipo de endpoint e sessão dedicada Corrigir configuração de conta e de conexão

O fluxo de trabalho existente em Java com foco em Jsoup (parser) descrito em este artigo aborda a abordagem de aquisição orientada a parser. Este artigo adiciona um contrato compartilhado para navegador estático, navegador local e navegador em nuvem sem substituir aquela página publicada.

Conclusão

A extração de dados da web em Java funciona melhor quando aquisição e extração são decisões separadas. Use Jsoup para o documento que você de fato possui, obtenha HTML renderizado quando a origem o exigir e valide o mesmo contrato de registros antes da exportação.

Complete a cadeia de ferramentas e os pré‑requisitos de sessão dedicada, teste uma única página permitida e depois adicione paginação específica da origem com escopo limitado.

Construa o caminho de navegação com o Scrapeless e avalie suas necessidades de recursos em relação à precificação atual. Discuta dúvidas sobre o fluxo de trabalho em Java no Telegram.

FAQ

P: O Jsoup consegue executar o JavaScript de um site?

O Jsoup analisa o HTML fornecido e não executa o JavaScript da página. Use um caminho de aquisição via navegador quando os registros necessários existirem apenas após a renderização.

P: É permitido fazer web scraping em Java em qualquer página pública?

Visibilidade pública não estabelece permissão para toda coleta ou uso. Revise os termos da origem, as regras de exclusão via robots, requisitos aplicáveis e a autorização do projeto antes de coletar.

P: Este fluxo de trabalho em Java exige um proxy separado?

Um cliente de navegador estático ou local precisa de qualquer roteamento permitido que sua origem exigir. O caminho em nuvem usa a configuração de Agent Browser alocada; configure sua saída (egress) por meio da configuração atual da conta.

P: O que o coletor deve fazer com um documento de desafio ou acesso negado?

O coletor deve rejeitar conteúdo inadequado e preservar o motivo da aquisição. Uma conexão de navegador em nuvem não substitui a verificação do conteúdo de origem.

P: Por que o mesmo seletor pode não retornar linhas após uma atualização da página?

A origem pode ter alterado a marcação, o comportamento de renderização ou a identidade da página. Reinspecione essas observações e a URL final antes de alterar o seletor ou aceitar um resultado vazio.

P: Quanta simultaneidade (concurrency) um piloto em Java deve usar?

Use um piloto limitado com um teto conservador por host, como três workers para a política deste exemplo. As regras de coleta da origem e o uso de recursos observado governam a expansão.

P: Este coletor pode ser executado sem um agente de IA ou ao lado do Selenium?

O fluxo de trabalho em Java pode ser executado como código determinístico sem um agente de IA. Um projeto Selenium existente pode manter sua camada de aquisição via navegador e enviar o HTML capturado para o mesmo contrato de validação e exportação.

Na Scorretless, acessamos apenas dados disponíveis ao público, enquanto cumprem estritamente as leis, regulamentos e políticas de privacidade do site aplicáveis. O conteúdo deste blog é apenas para fins de demonstração e não envolve atividades ilegais ou infratoras. Não temos garantias e negamos toda a responsabilidade pelo uso de informações deste blog ou links de terceiros. Antes de se envolver em qualquer atividade de raspagem, consulte seu consultor jurídico e revise os termos de serviço do site de destino ou obtenha as permissões necessárias.

Artigos mais populares

Catálogo