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 查询技术。此外,如果您需要任何进一步的信息或任何帮助,请随时通过 论坛 与我们联系。