htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源实现。是一个没有界面的浏览器,运行速度迅速。是junit的扩展之一
采用的是Rhinojs引擎。模拟js运行。
常规意义上,该项目可以用来进行页面的测试工作,实现网页自动化测试,(包括JS)
但是一般来说,在小型爬虫项目中,这种框架十分常用,可以有效的分析出 dom的标签,并且有效的运行页面上的js以便得到一些需要执行JS才能得到的值。
<dependency>
<!-- jsoup HTML parser library @ https://jsoup.org/ -->
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.14.3</version>
</dependency>
<!-- https://htmlunit.sourceforge.io/-->
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.58.0</version>
</dependency>
private String getJdHtml() {
List list = new ArrayList<String>();
String typhoonWeatherUrl="https://www.abc.com/";
try {
WebClient wc = new WebClient(BrowserVersion.CHROME);
// 启用JS解释器,默认为true
wc.getOptions().setJavaScriptEnabled(true);
// 禁用css支持
wc.getOptions().setCssEnabled(false);
// js运行错误时,是否抛出异常
wc.getOptions().setThrowExceptionOnScriptError(false);
// 状态码错误时,是否抛出异常
wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
// 设置连接超时时间 ,这里是5S。如果为0,则无限期等待
wc.getOptions().setTimeout(5000);
// 是否允许使用ActiveX
wc.getOptions().setActiveXNative(false);
// 等待js时间
wc.waitForBackgroundJavaScript(1 * 1000);
// 设置Ajax异步处理控制器即启用Ajax支持
wc.setAjaxController(new NicelyResynchronizingAjaxController());
// 不跟踪抓取
wc.getOptions().setDoNotTrackEnabled(false);
// 访问页面
HtmlPage page = wc.getPage(typhoonWeatherUrl);
// 以xml的形式获取响应文本
String pageXml = page.asXml();
System.out.println(pageXml);
//Document document = Jsoup.parse(pageXml);
return pageXml;
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Test
void getJdProduct() {
//--1
String jdHtml = getJdHtml();
if(jdHtml == null) {
System.out.println("抓取网页失败");
return;
}
//--2
Document doc = Jsoup.parse(jdHtml);
Element j_goodsList = doc.getElementById("J_goodsList");
//--3 通过class获取产品列表
Elements glItems = j_goodsList.getElementsByClass("gl-item");
glItems.forEach(e -> {
// 产品名称
Elements pNameClass = e.getElementsByClass("p-name");
String pName = pNameClass.first().text();
System.out.println(pName);
// 产品价格
Elements pPriceClass = e.getElementsByClass("p-price");
Elements iTag = pPriceClass.first().getElementsByTag("i");
String pPrice = iTag.first().text();
//String pPrice = pPriceClass.first().text();
System.out.println(pPrice);
// 产品图片
Elements pImgClass = e.getElementsByClass("p-img");
Elements img = pImgClass.first().getElementsByTag("img");
String attr = img.first().attr("data-lazy-img");
System.out.println(attr);
});
}