Web Scraper Java

O Web Scraping também é chamado de raspagem de dados, coleta da Web ou rastreamento da Web, que é usado para extrair dados das páginas da Web. Um web scraper pode usar diferentes abordagens para extrair informações. Por exemplo, XPath, seletores CSS, filtros personalizados, navegação HTML, etc. De acordo com esses cenários, este artigo aborda como criar um web scraper programaticamente em Java.

Configuração da biblioteca Java Web Scraping

Aspose.HTML for Java API oferece suporte a recursos de web scraping usando diferentes técnicas. Você pode simplesmente acessar a API baixando os arquivos JAR da página Downloads ou usar as seguintes configurações do Maven no arquivo pom.xml do seu projeto:

Repositório:

 <repositories>
     <repository>
         <id>snapshots</id>
         <name>repo</name>
         <url>http://repository.aspose.com/repo/</url>
     </repository>
</repositories>

Dependência:

 <dependencies>
    <dependency>
        <groupId>com.aspose</groupId>
        <artifactId>aspose-html</artifactId>
        <version>21.12</version>
        <classifier>jdk16</classifier>
    </dependency>
</dependencies>

Web Scraping com navegação HTML em Java

Você pode trabalhar com a classe Node para navegar nas páginas HTML. O snippet de código abaixo demonstra como navegar em um documento HTML em Java:

// Preparar um código HTML
String html_code = "<span>Hello</span> <span>World!</span>";

// Inicializar um documento a partir do código preparado
com.aspose.html.HTMLDocument document = new com.aspose.html.HTMLDocument(html_code, ".");
try {
    // Obter a referência ao primeiro filho (primeiro SPAN) do BODY
    com.aspose.html.dom.Element element = document.getBody().getFirstElementChild();
    System.out.println(element.getTextContent()); // output: Hello

    // Obtenha a referência ao segundo elemento SPAN
    element = element.getNextElementSibling();
    System.out.println(element.getTextContent()); // output: World!
} finally {
    if (document != null) {
        document.dispose();
    }
}

Inspeção do documento HTML e seus elementos em Java

Você pode trabalhar com o método de travessia do elemento para navegar pelas páginas HTML. O exemplo de código abaixo detalha como inspecionar documentos HTML em Java.

// Carregar um documento de um arquivo
String documentPath = "html_file.html";
var document = new com.aspose.html.HTMLDocument(documentPath);
{
    // Obter o elemento html do documento
    var element = document.getDocumentElement();                
    System.out.println(element.getTagName()); // HTML
    
    // Obter o último elemento do elemento html
    element = element.getLastElementChild();
    System.out.println(element.getTagName()); // BODY
    
    // Obter o primeiro elemento do elemento body
    element = element.getFirstElementChild();
    System.out.println(element.getTagName()); // H1
    System.out.println(element.getTextContent()); // Header 1     
}

Uso de filtro personalizado para Web Scraper em Java

Você pode definir um filtro personalizado para ignorar ou aceitar filtros específicos para trabalhar com o web scraper em Java. O exemplo de código abaixo explica como trabalhar com filtros personalizados ou definidos pelo usuário em um web scraper usando Java:

public class OnlyImageFilter extends com.aspose.html.dom.traversal.filters.NodeFilter {

    @Override
    public short acceptNode(com.aspose.html.dom.Node n) {
        // O filtro atual ignora todos os elementos, exceto os elementos IMG.
        return "img".equals(n.getLocalName()) ? FILTER_ACCEPT : FILTER_SKIP;
    }

}

Posteriormente, depois de configurar um filtro personalizado, você pode navegar facilmente em uma página HTML usando o snippet de código abaixo:

// Preparar um código HTML
String code = "    < p > Hello </p >\n" +
              "    <img src = 'image1.png' >\n" +
              "    <img src = 'image2.png' >\n" +
              "    <p > World ! </p >\n";

// Inicializar um documento com base no código preparado
com.aspose.html.HTMLDocument document = new com.aspose.html.HTMLDocument(code, ".");
try {
    // Para iniciar a navegação HTML, precisamos criar uma instância do TreeWalker.
    // Os parâmetros especificados significam que ele começa a andar da raiz do documento, iterando todos os nós e usando nossa implementação personalizada do filtro
    com.aspose.html.dom.traversal.ITreeWalker iterator = document.createTreeWalker(document, com.aspose.html.dom.traversal.filters.NodeFilter.SHOW_ALL, new OnlyImageFilter());
    // Usar
    while (iterator.nextNode() != null) {
        // Como estamos usando nosso próprio filtro, o nó atual sempre será uma instância do HTMLImageElement.
        // Portanto, não precisamos das validações adicionais aqui.
        com.aspose.html.HTMLImageElement image = (com.aspose.html.HTMLImageElement) iterator.getCurrentNode();

        System.out.println(image.getSrc());
        // saída: imagem1.png
        // saída: image2.png
    }
} finally {
    if (document != null) {
        document.dispose();
    }
}

Web Scraping usando XPath Query em Java

Você pode selecionar diferentes nós de um documento HTML por diferentes critérios usando XPath. O código abaixo demonstra como realizar web scraping usando XPath Query em Java:

// Preparar um código HTML
String code = "< div class='happy' >\n" +
              "        <div >\n" +
              "            <span > Hello ! </span >\n" +
              "        </div >\n" +
              "    </div >\n" +
              "    <p class='happy' >\n" +
              "        <span > World </span >\n" +
              "    </p >\n";

// Inicializar um documento com base no código preparado
com.aspose.html.HTMLDocument document = new com.aspose.html.HTMLDocument(code, ".");
try {
    // Aqui avaliamos a expressão XPath onde selecionamos todos os elementos SPAN filhos de elementos cujo atributo 'class' é igual a 'happy':
    com.aspose.html.dom.xpath.IXPathResult result = document.evaluate("//*[@class='happy']//span",
            document,
            null,
            com.aspose.html.dom.xpath.XPathResultType.Any,
            null
    );

    // Iterar sobre os nós resultantes
    for (com.aspose.html.dom.Node node; (node = result.iterateNext()) != null; ) {
        System.out.println(node.getTextContent());
        // saída: Olá
        // saída: Mundo!
    }
} finally {
    if (document != null) {
        document.dispose();
    }
}

Web Scraping com CSS Selector em Java

Você pode pesquisar os itens necessários em um web scraper usando o seletor CSS. Você pode especificar um parâmetro como um seletor de consulta e, em seguida, uma lista de correspondência do seletor é retornada ao web scraper. O exemplo de código a seguir mostra como usar o seletor CSS em um web scraper usando Java:

// Preparar um código HTML
String code = "< div class='happy' >\n" +
              "        <div >\n" +
              "            <span > Hello </span >\n" +
              "        </div >\n" +
              "    </div >\n" +
              "    <p class='happy' >\n" +
              "        <span > World ! </span >\n" +
              "    </p >\n";

// Inicializar um documento com base no código preparado
com.aspose.html.HTMLDocument document = new com.aspose.html.HTMLDocument(code, ".");
try {
    // Aqui criamos um seletor CSS que extrai todos os elementos cujo atributo 'class' é igual a 'happy' e seus elementos filhos SPAN
    com.aspose.html.collections.NodeList elements = document.querySelectorAll(".happy span");

    // Iterar sobre a lista de elementos resultante
    elements.forEach(element ->{
        System.out.println(((com.aspose.html.HTMLElement) element).getInnerHTML());
        // saída: Olá
        // saída: Mundo!
    });
} finally {
    if (document != null) {
        document.dispose();
    }
}

Conclusão

Neste artigo, você explorou diferentes métodos que podem ser usados para criar um web scraper em Java. Você só precisa fazer algumas chamadas de API usando a biblioteca Aspose.HTML for Java para criar um web scraper em Java. Você pode explorar as técnicas de navegação HTML, seletor de CSS, filtro personalizado e consulta XPath neste artigo. Além disso, sinta-se à vontade para entrar em contato conosco através do fórum se precisar de mais informações ou assistência.

Veja também

Converter EPUB para XPS em Java