htmlunit 抓取_如何使用HtmlUnit编写屏幕抓取应用程序

本文对比了JSoup和HtmlUnit在Java屏幕抓取中的应用,并提供了一个使用HtmlUnit实现的示例,该示例抓取网页标题、作者信息及链接列表。教程详细解释了如何利用HtmlUnit进行无浏览器的Web测试和数据提取。

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屏幕刮板应用程序

翻译自: https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/How-to-write-a-screen-scraper-application-with-HtmlUnit

htmlunit 抓取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值