java htmlunit js_Java版web浏览器htmlunit使用记录-js解释器

记录一下:前两天有个爬虫的项目出问题了,爬取的服务端升级了mlgbd,给每个关键页面加了cookie验证。

访问服务器端给返回状态码202,并且返回的html里有一段加密过的js,这段js通过获取meta标签里动态传入的content值进行计算然后把值存入cookie,本来想看js直接写的啥 自己通过逻辑取出值去生成cookie的,结果发现js里的几个关键值都是后台动态生成的 ,想来想去直接取值麻烦 (1万行加密js代码,看的他妈头都大了 还是混淆过的)。

实在是受不了了 领导还天天催。结果想有没有什么能直接运行js的东西,就找到了htmlunit。

通过htmlunit拿到页面然后运行里面的js将js设置的cookie拿到,放到自己请求的cookie中,问题顺利解决了(由于每个页面都有js设置cookie,先用htmlunit执行js拿到cookie再用httpclient去获取页面访问)。

public String getJsCookie(String url,String... cName) {

WebClient webClient = new WebClient(BrowserVersion.CHROME);

//2.设置连接的相关选项

webClient.getOptions().setCssEnabled(false);

webClient.getOptions().setJavaScriptEnabled(true); //需要解析js

webClient.getOptions().setThrowExceptionOnScriptError(false); //解析js出错时不抛异常

//webClient.setJavaScriptEngine(new MyJavaScriptEngine(webClient));//自定义JavaScript引擎,有js错误不打印

webClient.getOptions().setTimeout(10000); //超时时间 ms

webClient.waitForBackgroundJavaScript(10000); //等侍js脚本执行完成

//3.抓取页面

HtmlPage page = null;

try {

page = webClient.getPage(url);//爬取页面的路径

} catch (IOException e) {

e.printStackTrace();

}

//4.将页面转成指定格式

//System.out.println(page.asXml());

CookieManager CM = webClient.getCookieManager(); //WC = Your WebClient's name

Set cookies_ret = CM.getCookies();//拿到htmlunit存取的页面cookie

String cookiestr="";//按照默认方式进行拼接

for(com.gargoylesoftware.htmlunit.util.Cookie cookie:cookies_ret){

//System.out.println(cookie.getName()+":"+cookie.getValue());

for(String name:cName){

if(cookie.getName().equals(name)){

cookiestr+=name+"="+cookie.getValue()+";";

}

}

}

return cookiestr;

}

服务端是可以访问了,但是有几个问题还待解决。

1.js报错关不掉,重写了不知是版本问题还是啥 没时间去弄了 直接设置异常不抛出也不管用。测试的时候不知道改了啥了 有几次没抛 结果还原代码 改不回去了。。。

2.解析js很慢。解析js太慢了 可能跟需要下载js文件有关 待优化,不过听说htmlunit对js支持不太好

3.试了几个版本发现都需要httpclient 4.5.2版本。 htmlunit最后用的 2.25最新版的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
htmlunit-core-js 是一个基于 Rhino JavaScript 引擎的 JavaScript 引擎,它可以帮助你在 Java 应用程序中运行 JavaScript 代码。下面是一个简单的示例,演示如何使用 htmlunit-core-js 运行 JavaScript 代码: ```java import org.mozilla.javascript.Context; import org.mozilla.javascript.Scriptable; import org.mozilla.javascript.ScriptableObject; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlPage; public class HtmlUnitCoreJsExample { public static void main(String[] args) throws Exception { // 创建一个 JavaScript 引擎上下文 Context context = Context.enter(); try { // 创建一个顶级作用域对象 Scriptable scope = context.initStandardObjects(); // 将一个 Java 对象添加到 JavaScript 环境中 Object wrappedOut = Context.javaToJS(System.out, scope); ScriptableObject.putProperty(scope, "out", wrappedOut); // 执行一段 JavaScript 代码 String script = "var message = 'Hello, world!'; out.println(message);"; context.evaluateString(scope, script, "example", 1, null); // 使用 HTMLUnit 来执行 JavaScript 代码 WebClient webClient = new WebClient(); HtmlPage page = webClient.getPage("https://www.baidu.com/"); String pageTitle = (String) context.evaluateString(scope, "document.title", "example", 1, null); System.out.println("Page title: " + pageTitle); } finally { // 释放 JavaScript 引擎上下文 Context.exit(); } } } ``` 这个示例包括以下步骤: 1. 创建一个 JavaScript 引擎上下文。 2. 创建一个顶级作用域对象,并将一个 Java 对象添加到 JavaScript 环境中。 3. 执行一段 JavaScript 代码,将输出打印到控制台。 4. 使用 HTMLUnit 库加载一个网页,并在 JavaScript 引擎环境中获取页面标题。 5. 释放 JavaScript 引擎上下文。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值