htmlunit 抓取
我最近发表了一篇有关使用Java进行屏幕抓取的文章,一些Twitter追随者思考为什么我使用JSoup而不是流行的,无浏览器的Web测试框架HtmlUnit。 我没有特定的原因,所以我决定使用HtmlUnit而不是JSoup重现完全相同的屏幕抓取器应用程序教程。
原始教程只是从我写的GitHub访谈问题文章中提取了一些信息。 它提取了页面标题,作者名称以及页面上所有链接的列表。 本教程将做完全相同的事情,只是有所不同。
HtmlUnit Maven POM条目
使用HtmlUnit的第一步是创建一个基于Maven的项目 ,并将适当的GAV添加到POM文件的依赖项部分。 这是依赖项中包含HtmlUnit GAV的完整Maven POM文件的示例。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mcnz.screen.scraper</groupId>
<artifactId>java-screen-scraper</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.34.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
HtmlUnit屏幕抓取代码
HtmlUnit屏幕抓取应用程序创建过程的下一步是使用main方法生成Java类,然后使用要HtmlUnit抓取站点的URL创建HtmlUnit WebClient实例。
package com.mcnz.screen.scraper;
import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.html.*;
public class HtmlUnitScraper {
public static void main(String args[]) throws Exception {
String url = "https://www.theserverside.com/video/IBM-Watson-Content-Hub-has-problems-before-you-even-start";
WebClient webClient = new WebClient();
webClient.getOptions().setUseInsecureSSL(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(false);
}
}
HtmlUnit API
WebClient类的getPage(URL)方法将解析提供的URL,并返回一个代表Web页的HtmlPage对象。 但是,CSS,JavaScript和缺少正确配置的SSL密钥库可能会导致getPage(URL)方法失败。 在获取HtmlPage对象之前,先原型关闭这三个功能是明智的。
webClient.getOptions().setUseInsecureSSL(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(false);
HtmlPage htmlPage = webClient.getPage(url);
在前面的示例中,我们通过捕获要解析的网页的标题来测试了Java屏幕抓取功能。 要使用HtmlUnit屏幕抓取工具执行此操作,我们只需在htmlPage实例上调用getTitle()方法即可:
System.out.println(htmlPage.getTitleText ());
运行Java屏幕抓取应用程序
您可以在此时编译代码并运行应用程序,它将输出页面标题:
Tough sample GitHub interview questions and answers for job candidates
显示作者姓名的页面段CSS选择器是#author> div> a。 如果将此CSS选择器插入querySelector(String)方法中,它将返回一个DomNode实例,该实例可用于检查CSS选择的结果。 只需要求domNode asText即可返回文章作者的姓名:
DomNode domNode = htmlPage.querySelector("#author > div > a");
System.out.println(domNode.asText ());
原始文章的最后一项重要成就是打印出页面上每个锚链接的文本。 要使用HtmlUnit Java屏幕抓取工具实现此目的,请调用HtmlPage实例的getAnchors方法。 这将返回HtmlAnchor实例的列表。 然后,我们可以遍历列表,并通过调用getAttribute方法输出与链接关联的URL:
List<HtmlAnchor> anchors = htmlPage.getAnchors ();
for (HtmlAnchor anchor : anchors) {
System.out.println(anchor.getAttribut e ("href"));
}
当类运行时,输出如下:
Java screen scraper with HtmlUnit
Tough sample GitHub interview questions and answers for job candidates.
Cameron McKenzie.
Link: https://www.theserverside.com/video/Tips-and-tricks-on-how-to-use-Jenkins-Git-Plugin
Link: https://www.theserverside.com/video/Tackle-these-10-sample-DevOps-interview-questions-and-answers
Link: https://www.theserverside.com/video/A-RESTful-APIs-tutorial-Learn-key-web-service-design-principles
JSoup vs HtmlUnit作为屏幕抓取工具
那么我如何看待这两种不同的方法呢? 好吧,如果我要编写自己的Java屏幕抓取工具,则可能会选择HtmlUnit。 API内置了许多实用程序方法,例如HtmlPage的getAnchors()方法,使执行常见任务变得更加容易。 该API由其维护者定期更新,并且许多开发人员已经知道如何使用该API,因为它通常用作Java Web应用程序的单元测试框架。 最后,HtmlUnit具有一些用于处理CSS和JavaScript的高级功能,这些功能允许该技术的各种外围应用程序。
总体而言,这两个API都是实现Java屏幕抓取工具的绝佳选择。 您真的不会错任何一个。
您可以在GitHub上找到 HtmlUnit屏幕抓取应用程序的完整代码。
HTMLUnit屏幕刮板应用程序
htmlunit 抓取
本文对比了JSoup和HtmlUnit在Java屏幕抓取中的应用,并提供了一个使用HtmlUnit实现的示例,该示例抓取网页标题、作者信息及链接列表。教程详细解释了如何利用HtmlUnit进行无浏览器的Web测试和数据提取。
1360

被折叠的 条评论
为什么被折叠?



