网络爬虫 Java

Web Scraping 也称为数据抓取、网络收集或网络爬虫,用于从网页中提取数据。网络爬虫可以使用不同的方法来提取信息。例如,XPath、CSS 选择器、自定义过滤器、HTML 导航等。根据这些场景,本文将介绍如何使用 Java 以编程方式创建 Web 抓取工具。

Java Web Scraping 库配置

Aspose.HTML for Java API 支持使用不同的技术提供网络抓取功能。您可以通过从 Downloads 页面下载 JAR 文件或在项目的 pom.xml 文件中使用以下 Maven 配置来简单地访问 API:

存储库:

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

依赖:

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

使用 Java 中的 HTML 导航进行网页抓取

您可以使用 Node 类来导航 HTML 页面。下面的代码片段演示了如何在 Java 中导航 HTML 文档:

// 准备 HTML 代码
String html_code = "<span>Hello</span> <span>World!</span>";

// 从准备好的代码初始化一个文档
com.aspose.html.HTMLDocument document = new com.aspose.html.HTMLDocument(html_code, ".");
try {
    // 获取对 BODY 的第一个孩子(第一个 SPAN)的引用
    com.aspose.html.dom.Element element = document.getBody().getFirstElementChild();
    System.out.println(element.getTextContent()); // output: Hello

    // 获取对第二个 SPAN 元素的引用
    element = element.getNextElementSibling();
    System.out.println(element.getTextContent()); // output: World!
} finally {
    if (document != null) {
        document.dispose();
    }
}

在 Java 中检查 HTML 文档及其元素

您可以使用元素遍历方法来导航 HTML 页面。下面的代码示例详细说明了如何检查 Java 中的 HTML 文档。

// 从文件加载文档
String documentPath = "html_file.html";
var document = new com.aspose.html.HTMLDocument(documentPath);
{
    // 获取文档的html元素
    var element = document.getDocumentElement();                
    System.out.println(element.getTagName()); // HTML
    
    // 获取html元素的最后一个元素
    element = element.getLastElementChild();
    System.out.println(element.getTagName()); // BODY
    
    // 获取body元素的第一个元素
    element = element.getFirstElementChild();
    System.out.println(element.getTagName()); // H1
    System.out.println(element.getTextContent()); // Header 1     
}

Java 中 Web Scraper 的自定义过滤器用法

您可以设置自定义过滤器以跳过或接受特定过滤器以使用 Java 中的网络爬虫。下面的代码示例详细说明了如何使用 Java 在 Web 抓取工具中使用自定义或用户定义的过滤器:

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

    @Override
    public short acceptNode(com.aspose.html.dom.Node n) {
        // 当前过滤器会跳过除 IMG 元素之外的所有元素。
        return "img".equals(n.getLocalName()) ? FILTER_ACCEPT : FILTER_SKIP;
    }

}

随后,设置自定义过滤器后,您可以使用以下代码片段轻松导航 HTML 页面:

// 准备 HTML 代码
String code = "    < p > Hello </p >\n" +
              "    <img src = 'image1.png' >\n" +
              "    <img src = 'image2.png' >\n" +
              "    <p > World ! </p >\n";

// 根据准备好的代码初始化一个文档
com.aspose.html.HTMLDocument document = new com.aspose.html.HTMLDocument(code, ".");
try {
    // 要启动 HTML 导航,我们需要创建一个 TreeWalker 实例。
    // 指定的参数意味着它从文档的根开始遍历,迭代所有节点并使用我们自定义的过滤器实现
    com.aspose.html.dom.traversal.ITreeWalker iterator = document.createTreeWalker(document, com.aspose.html.dom.traversal.filters.NodeFilter.SHOW_ALL, new OnlyImageFilter());
    // 利用
    while (iterator.nextNode() != null) {
        // 由于我们使用的是我们自己的过滤器,因此当前节点将始终是 HTMLImageElement 的一个实例。
        // 所以,我们在这里不需要额外的验证。
        com.aspose.html.HTMLImageElement image = (com.aspose.html.HTMLImageElement) iterator.getCurrentNode();

        System.out.println(image.getSrc());
        // 输出:image1.png
        // 输出:image2.png
    }
} finally {
    if (document != null) {
        document.dispose();
    }
}

在 Java 中使用 XPath 查询进行 Web 抓取

您可以使用 XPath 根据不同的标准选择 HTML 文档的不同节点。下面的代码演示了如何在 Java 中使用 XPath Query 执行 Web 抓取:

// 准备 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";

// 根据准备好的代码初始化一个文档
com.aspose.html.HTMLDocument document = new com.aspose.html.HTMLDocument(code, ".");
try {
    // 在这里,我们评估 XPath 表达式,我们从“class”属性等于“happy”的元素中选择所有子 SPAN 元素:
    com.aspose.html.dom.xpath.IXPathResult result = document.evaluate("//*[@class='happy']//span",
            document,
            null,
            com.aspose.html.dom.xpath.XPathResultType.Any,
            null
    );

    // 迭代结果节点
   for (com.aspose.html.dom.Node node; (node = result.iterateNext()) != null; ) {
        System.out.println(node.getTextContent());
        // 输出:你好
        // 输出:世界!
    }
} finally {
    if (document != null) {
        document.dispose();
    }
}

使用 Java 中的 CSS 选择器进行网页抓取

您可以使用 CSS 选择器在网络爬虫中搜索所需的项目。您可以将参数指定为查询选择器,然后将匹配选择器的列表返回给网络爬虫。以下代码示例展示了如何在使用 Java 的网络爬虫中使用 CSS 选择器:

// 准备 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";

// 根据准备好的代码初始化一个文档
com.aspose.html.HTMLDocument document = new com.aspose.html.HTMLDocument(code, ".");
try {
    // 在这里,我们创建了一个 CSS 选择器,用于提取所有 'class' 属性等于 'happy' 的元素及其子 SPAN 元素
    com.aspose.html.collections.NodeList elements = document.querySelectorAll(".happy span");

    // 迭代结果的元素列表
    elements.forEach(element -> {
        System.out.println(((com.aspose.html.HTMLElement) element).getInnerHTML());
        // 输出:你好
        // 输出:世界!
    });
} finally {
    if (document != null) {
        document.dispose();
    }
}

结论

在本文中,您探索了可用于在 Java 中创建网络爬虫的不同方法。您只需要使用 Aspose.HTML for Java 库进行几次 API 调用,即可在 Java 中创建网络爬虫。您可以在本文中探索 HTML 导航、CSS 选择器、自定义过滤器和 XPath 查询技术。此外,如果您需要任何进一步的信息或任何帮助,请随时通过 论坛 与我们联系。

也可以看看

在 Java 中将 EPUB 转换为 XPS