当前位置:首页 > 未分类 > 正文内容

htmlunit JS 读取错误解决方法

关中浪子4年前 (2021-03-09)未分类1377
买泛域名SSL证书 送5斤装现摘猕猴桃一箱、同时提供技开源商城搭建免费技术支持。
泛域名ssl证书 239元1年送1个月、单域名39元1年,Sectigo(原Comodo证书)全球可信证书,强大的兼容性,高度安全性,如有问题7天内可退、可开发票
加微信VX 18718058521 备注SSL证书
【腾讯云】2核2G4M云服务器新老同享99元/年,续费同价

进行各种各样的网页爬虫过程中,有些网页直接httpclient拿过来就能用,但是有些网站是需要等待js加载样式或者某些值的,使用httpclient没办法设置js等待时间,然后再抓取值。


htmlunit可以完美解决这个问题。但是在使用htmlunit访问网页时 经常会出现各种网页的JavaScript加载过程中的警告与提示信息 例如:


ERROR c.g.h.javascript.DefaultJavaScriptErrorListener - Error during JavaScript execution

com.gargoylesoftware.htmlunit.ScriptException: URIError: Malformed URI sequence.


在代码中已经对WebClient进行设置了webClient.getOptions().setThrowExceptionOnScriptError(false);


并不能关闭这些提示信息 导致每次访问网页都会打印一大串一大串的无用信息


我并不关心他js报什么错,我只关心拿下来页面的结果。通过查看这个报错类,重写它里面的方法,把所有log输出语句全部删除,就可以达到不打印错误信息的作用了。


类路径是:com.gargoylesoftware.htmlunit.javascript.DefaultJavaScriptErrorListener


解决方法代码如下

private String getTimeByHtmlUnit(String url) throws IOException {
	if (StringUtils.isBlank(url)) {
		return "";
	}
	WebClient webClient = new WebClient(BrowserVersion.CHROME);
	webClient.getOptions().setJavaScriptEnabled(true);
	webClient.getOptions().setCssEnabled(false);
	webClient.getOptions().setActiveXNative(false);
	webClient.getOptions().setThrowExceptionOnScriptError(false);
	webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
	webClient.getOptions().setTimeout(5000);
    // -----重点-----设置为我们自定义的错误处理类
	webClient.setJavaScriptErrorListener(new MyJSErrorListener());
	webClient.setJavaScriptTimeout(5000);
	HtmlPage page = webClient.getPage(url);
	//wait for js execute
	webClient.waitForBackgroundJavaScript(3000);
    //这里是我的爬取目标 忽略即可
	DomNodeList<DomElement> domElements = page.getElementsByTagName("relative-time");
	if (domElements.isEmpty()) {
		return "";
	}
	return domElements.get(0).getAttribute("datetime");
}
 
/**
 * 忽略html unit打印的所有js加载报错信息
 */
public class MyJSErrorListener extends DefaultJavaScriptErrorListener {
	@Override
	public void scriptException(HtmlPage page, ScriptException scriptException) {
	}
 
	@Override
	public void timeoutError(HtmlPage page, long allowedTime, long executionTime) {
	}
 
	@Override
	public void malformedScriptURL(HtmlPage page, String url, MalformedURLException malformedURLException) {
 
	}
 
	@Override
	public void loadScriptError(HtmlPage page, URL scriptUrl, Exception exception) {
 
	}
 
	@Override
	public void warn(String message, String sourceName, int line, String lineSource, int lineOffset) {
 
	}
}	


找梯子最重要的就是稳定,这个已经上线三年了,一直稳定没有被封过,赶紧下载备用吧!

扫描二维码推送至手机访问。

版权声明:本文由码农翻生发布,如需转载请注明出处。

本文链接:https://lubojian.cn/post/20.html

分享给朋友:

相关文章

Correct the classpath of your application so that it contains a single, compatible version of org.ap

Correct the classpath of your application so that it contains a single, compatible version of org.ap

这个错误一般是jar包冲突的问题,要删除多余的jar包如图项目下有2个不同版本的jar包,导致报错,删除多余的jar包就好了...

js 删除json对象某个键key

解决方法:假如json是一个对象,想移除其中的key名为keyname的键delete json['keyname'];delete json.keyname;...

java图片转base64

package org.jeecg.common.util;   import org.apache.commons.codec.binary.Base64; import sun.misc.B...

(永久激活)最新navicat安装激活破解永久使用教程

(永久激活)最新navicat安装激活破解永久使用教程

这篇文章主要介绍了Navicat Premium永久破解激活教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下这里讲的是windows下的navicat 15最新激活破解教程,亲测有效...

我有一个json结构的标准问答对,想通过 BAAI/bge-large-zh-v1.5 将问答对转为向量存储在 milvus 中,然后 另一个系统会提问然后输出回答,这个系统的回答需要和我的

为了实现您的需求,我们需要分几个步骤来操作:准备环境:确保安装了必要的库,如 transformers(用于加载模型),milvus(用于存储向量),以及 json(用于处理JSON数据)。加载模型:使用 tr...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。