文档章节

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

 起名字什么的太麻烦了
发布于 2017/03/31 10:00
字数 615
阅读 78
收藏 0

记录一下:前两天有个爬虫的项目出问题了,爬取的服务端升级了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<com.gargoylesoftware.htmlunit.util.Cookie> 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最新版的。

© 著作权归作者所有

共有 人打赏支持
粉丝 1
博文 37
码字总数 20115
作品 0
私信 提问
模拟浏览器的神器 - HtmlUnit

随着Web的发展,RIA越来越多,JavaScript和Complex AJAX Libraries给网络爬虫带来了极大的挑战,解析页面的时候需要模拟浏览器执行JavaScript才能获得需要的文本内容。 好在有一个Java开源项...

杨尚川
2014/04/04
0
6
怎么抓取js执行后的页面

我想直接抓取新浪微博的搜索结果页面,用的htmlunit。但是抓到的页面是js执行前的,我看htmlunit的功能介绍上说是支持js的,但是我不知道怎么办啊T T 求帮忙求指导 或者不用htmlunit也行,有...

李XX
2012/12/05
3.5K
3
Java_爬虫,如何抓取Js动态生成数据的页面?

很多网站是用js或Jquery 生成数据的,到后台获取到数据以后,用 document.write()或者("#id").html="" 的方式 写到页面中,这个时候用浏览器查看源码是看不到数据的。 HttpClient是不行的,看...

Inszt
2014/07/25
10.7K
9
htmlunit执行网页输出结果的问题

(一)环境: 1.网页:http://www.example.com/line.html (网站有调用外部js,页面中也有部分js脚本改变网页实际的输出,脚本执行后,页面中body部分只保留一串文本) 2.HtmlUnit 3.Java开发...

莫铭
2015/10/28
1K
1
无需图形界面环境下的浏览器项目一览表

本表几乎列出了所有无需图形界面环境下的浏览器开源项目,可用于自动化、测试或者其他用途。 软件名 介绍 支持语言 Awesomium 基于Chromium无图形界面浏览器引擎。 C++, .NET benv Benv是nod...

oschina
2016/07/27
13.5K
18

没有更多内容

加载失败,请刷新页面

加载更多

泛型就这么简单

前言 从今天开始进入Java基础的复习,可能一个星期会有一篇的<十道简单算法>,我写博文的未必都是正确的~如果有写错的地方请大家多多包涵并指正~ 今天要复习的是泛型,泛型在Java中也是个很...

群星纪元
19分钟前
0
0
大数据提醒你:中国这些古建筑,可能是下一个巴黎圣母院!

大家晚上好,我是今天的提笔人嗅嗅。 巴黎圣母院失火事件让我的心情很沉重,一句无关痛痒的安慰“巴黎不哭”,已经不能表达我对这场文化之殇的惋惜之痛,人类伟大的建筑在一瞬间被毁灭。 世界...

forespider
31分钟前
0
0
mysql函数substring_index的用法

substring_index 按索引字符位进行截取字符串 substring_index(“待截取的字符串”,“截取数据依据的字符”,截取字符的位置N) 第三个参数可正,可负。正数表示索引字符前面的字符串,负数...

echojson
31分钟前
0
0
好程序员web前端分享用CSS和JS打造一个简单的图片编辑器

好程序员web前端分享用CSS和JS打造一个简单的图片编辑器,本文主要是利用CSS的 filter和简单的Jquery代码来实现一个简单的图片编辑器,包括对图片的透明度,黑白,图片亮度等调节。 CSS filt...

好程序员IT
41分钟前
2
0
浅析spring mvc的细节

spring mvc 整体结构 系统监听到请求 -> 通知tomcat -> 根据web.xml 通知相应的拦截器(spring mvc 通常指DispatcherServlet) --> 检查url是否有相匹配的请求实现 --> 拿到请求实现bean的适配...

最爱肉肉
42分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部