htmlunit无法获取执行js后的网页内容,特别急

兵工厂三剑客 2017-12-25 07:14:39
参考了网上的一些资料,看到很多人都能获取。
我的主要代码如下:


private static void readHtml(String url)
throws FailingHttpStatusCodeException, MalformedURLException, IOException, InterruptedException {

WebClient client = new WebClient(BrowserVersion.FIREFOX_24);
client.setJavaScriptTimeout(5000);
client.getOptions().setUseInsecureSSL(true);// 接受任何主机连接 无论是否有有效证书
client.getOptions().setJavaScriptEnabled(true);// 设置支持javascript脚本
client.getOptions().setCssEnabled(false);// 禁用css支持
client.getOptions().setThrowExceptionOnScriptError(false);// js运行错误时不抛出异常
client.getOptions().setTimeout(100000);// 设置连接超时时间
client.getOptions().setDoNotTrackEnabled(false);
client.setAjaxController(new NicelyResynchronizingAjaxController());// 设置Ajax异步
client.waitForBackgroundJavaScript(20000);
HtmlPage page = (HtmlPage) client.getPage(url);
// String hrefValue = "javascript:add(1,1,'+');";
// ScriptResult s = page.executeJavaScript(hrefValue);//执行js方法
// HtmlPage hpm=(HtmlPage) s.getNewPage();//获得执行后的新page对象
// client.setJavaScriptTimeout(5000);
Thread.sleep(3000);
String content = page.asXml();
System.out.println(content);
client.closeAllWindows();
}


用的htmlunit是2.14,但是以上代码输出的内容是执行js之前 的内容。请问是什么原因。

特别急。
...全文
1869 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
MarkC乾 2020-02-28
  • 打赏
  • 举报
回复
大佬,怎么设置不需要登录验证
lozhyf 2019-04-01
  • 打赏
  • 举报
回复
把图表可以抓过来吗
caoqinghuang 2019-02-12
  • 打赏
  • 举报
回复
无良的楼主,您倒是把具体解决方案讲清楚哈~~~~
@.. 2018-12-21
  • 打赏
  • 举报
回复
我现在也碰到了和楼主相似的问题,就是拿不到js加载的ajax后的数据,只是拿到一个页面框架。
痴人十三少 2018-06-05
  • 打赏
  • 举报
回复
登录验证是指什么,是指网页要登录验证还是htmlunit要求?求指教
兵工厂三剑客 2018-01-04
  • 打赏
  • 举报
回复
引用 2 楼 guorui521 的回复:
htmlunit对js不太友好,我今天试了一个phantomjs,这个是可以获取到js执行后的网页源码的!不过速度有点慢!
已经解决了,是因为需要登录验证。改成不需要登录验证就可以了。
紫苑1111 2017-12-27
  • 打赏
  • 举报
回复
htmlunit对js不太友好,我今天试了一个phantomjs,这个是可以获取到js执行后的网页源码的!不过速度有点慢!
兵工厂三剑客 2017-12-25
  • 打赏
  • 举报
回复
这个是网页源码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>工作票</title>
    <link href="/pages_res/B-JUI/themes/css/bootstrap.css?NEW-IMS-VERSION=1" rel="stylesheet">
    <link href="/pages_res/B-JUI/themes/css/style.css?NEW-IMS-VERSION=1" rel="stylesheet">
    <link href="/pages_res/B-JUI/themes/blue/core.css?NEW-IMS-VERSION=1" rel="stylesheet">
    <link href="/pages_res/B-JUI/plugins/nice-validator-1.0.7/jquery.validator.css?NEW-IMS-VERSION=1" rel="stylesheet">
    <link href="/pages_res/css/all-init.css?NEW-IMS-VERSION=1" rel="stylesheet">
    <link href="/jcw/pages_zz/css/pages_zz.css" rel="stylesheet">
</head>
<body>
<div class="M-table-box">
    <div class="pagesize-A4 nice-validator">

        <div id="sourceDot" class="marginB20"></div>
    </div>

    <script id="sourceDotTmpl" type="text/x-dot-template">
        <span class="workTicket-seal">垂直夜间</span>
        <input type="hidden" name="workticketFirstId" value="{{=it.workticketFirst.workticketFirstId}}"/>
        <input type="hidden" name="workticketId" value="{{=it.workticketId}}"/>
        <table class="page-green">
            <tbody>
            <tr class="ticket-type-1">
                <td colspan="6" class="text-center noborder">
                    <span class="ticketTitle text-green">接触网第一种工作票</span>
                </td>
            </tr>
            <tr>
                <td colspan="3" class="noborder">
                    <span class="text-green label-td">{{=it.deptName}}</span>
                </td>
                <td colspan="3" class="text-right noborder">
                    <span class="text-green label-td">第{{=it.workticketCode}}号</span>
                </td>
            </tr>
            <tr class="ticket-type-1">
                <td class="label-td">封锁范围</td>
                <td colspan="3">
                    <span>{{=it.workticketFirst.blockRange}}</span>
                </td>
                <td class="label-td" rowspan="2">发票人</td>
                <td class="text-center" rowspan="2">
                    <span>{{=it.workticketFirst.drawer}}</span>
                </td>
            </tr>
            <tr class="ticket-type-1">
                <td class="label-td">作业范围</td>
                <td colspan="3">
                    <span>{{=it.workticketFirst.workRange}}</span>
                </td>
            </tr>
            <tr>
                <td class="label-td">作业内容</td>
                <td colspan="3">
                    <span>{{=it.workticketFirst.workContent}}</span>
                </td>
                <td class="label-td">发票时间</td>
                <td class="text-center">
                    <span>{{=it.workticketFirst.drawDateString}}</span>
                </td>
            </tr>
            <tr style="height: 30px;">
                <td class="label-td">工作票有效期</td>
                <td colspan="5" class="text-center">
                    <span>自 {{=it.workticketFirst.validStartDateString}} 至 {{=it.workticketFirst.validEndDateString}} 止</span>
                </td>
            </tr>
            <tr>
                <td class="label-td">工作领导人</td>
                <td colspan="5" class="text-center">
                    <span>姓名:{{=it.workticketFirst.workLeader}}</span>
                    <span style="margin-left: 20px;">安全等级:(<span class="workLeaderSafeLevel">{{=it.workticketFirst.workLeaderSafeLevel}}级</span>)</span>
                </td>
            </tr>
            <tr class="user-list">
                <td class="label-td" rowspan="6">
                    作业组成员<br>姓名及安全<br>等级(安全等级<br>填在括号内)
                </td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
            </tr>
            <tr class="user-list">
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
            </tr>
            <tr class="user-list">
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
            </tr>
            <tr class="user-list">
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
            </tr>
            <tr class="user-list">
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
            </tr>
            <tr class="user-list">
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td class="last-td">
                    <span>总计<span class="totalWorkJoinner">0</span> 人</span>
                </td>
            </tr>
            <tr class="self-hide">
                <td class="label-td">工作组超出人员</td>
                <td colspan="5"><span class="workMemberOver"></span></td>
            </tr>
            <tr>
                <td class="label-td">需停电的设备</td>
                <td colspan="5">{{=it.workticketFirst.powerDownDevice}}</td>
            </tr>
            <tr>
                <td class="label-td">装设接地线的位置</td>
                <td colspan="5">
                    <span id="earthWireSite">{{=it.workticketFirst.earthWireSite}}</span>
                </td>
            </tr>
            <tr>
                <td class="label-td">作业区防护措施</td>
                <td colspan="5">{{=it.workticketFirst.workProtectMeasures}}</td>
            </tr>
            <tr>
                <td class="label-td">其他安全措施</td>
                <td colspan="5">{{=it.workticketFirst.otherSafetyMeasures}}</td>
            </tr>
            <tr>
                <td class="label-td">变更作业组成员记录</td>
                <td colspan="5"><span></span></td>
            </tr>
            <tr>
                <td class="label-td">工作票结束时间</td>
                <td colspan="5" class="text-center">
                    <span style="letter-spacing: 80px;" class="">年月日时分</span>
                </td>
            </tr>
            <tr>
                <td class="label-td">工作领导人(签字)</td>
                <td colspan="2"></td>
                <td class="label-td">发票人(签字)</td>
                <td colspan="2"></td>
            </tr>
            <tr>
                <td class="label-td">接票人(签字)</td>
                <td colspan="2"></td>
                <td class="label-td">接票时间</td>
                <td colspan="2" class="text-right">
                    <span style="letter-spacing: 30px;" class="">年月日时分</span>
                </td>
            </tr>
            <tr>
                <td class="label-td noborder" colspan="6">
                    <span class="pull-left">说明:本票用白色纸印绿色格和字。规格:A4。</span>
                </td>
            </tr>
            </tbody>
        </table>
    </script>
</div>

<script src="/pages_res/B-JUI/js/jquery-1.11.3.min.js?NEW-IMS-VERSION=1"></script>
<script src="/pages_res/B-JUI/js/bjui-all.js?NEW-IMS-VERSION=1"></script>
<script src="/pages_res/B-JUI/plugins/layer/layer.js?NEW-IMS-VERSION=1"></script>
<script src="/pages_res/B-JUI/plugins/dot/doT.js?NEW-IMS-VERSION=1"></script>
<script src="/pages_res/B-JUI/plugins/WdatePicker/WdatePicker.js?NEW-IMS-VERSION=1"></script>
<script src="/pages_res/js/all-init-fn.js?NEW-IMS-VERSaccountRecord7.htmlION=1"></script>
<script src="/jcw/pages_zz/js/common.js?NEW-IMS-VERSION=111"></script>
<script src="/jcw/pages_zz/js/workticket.js"></script>
<script type="text/javascript">

    $(function () {

        window.g_jdlId = searchByParam('jdlId');

        // DOT绑定数据
        ajaxGet('/JcwbWorkticket/show.do', {jdlId: g_jdlId}, function (response) {
            var sourceDotTmpl = $('#sourceDotTmpl').html();
            var dotString = top.doT.template(sourceDotTmpl)(response);
            $('#sourceDot').html(dotString);

            // 绑定作业组成员
            bindWorkMember(response.memberList);
        });
    });


</script>
</body>
</html>

Nutch Htmlunit Plugin 重要说明: 当前项目基于Nutch 1.X系列已停止更新维护,转向Nutch 2.x系列版本的新项目:http://www.oschina.net/p/nutch-ajax 项目简介 基于Apache Nutch 1.8和Htmlunit组件,实现对于AJAX加载类型页面的完整页面内容抓取解析。 According to the implementation of Apache Nutch 1.8, we can't get dynamic HTML information from fetch pages including AJAX requests as it will ignore all AJAX requests. This plugin will use Htmlunit to fetch whole page content with necessary dynamic AJAX requests. It developed and tested with Apache Nutch 1.8, you can try it on other Nutch version or refactor the source codes as your design. 主要特性 常规的HTML页面抓取: 对于常规的例如新闻类没有AJAX特性的页面可以直接用Nutch自带的protocol-http插件抓取。 常规的AJAX页面抓取: 对于绝大部分诸如jQuery ajax加载的页面,可以直接用protocol-htmlunit插件抓取。 特殊的AJAX请求页面抓取: 诸如淘宝/天猫的页面采用了独特的Kissy Javascript组件, 导致htmlunit无法直接感知到需要等待Kissy发起的请求完成,通过等待页面加载解析内容判断处理实现此类页面数据抓取。 基于页面滚动的AJAX请求页面抓取: 诸如淘宝/天猫的商品详情页面会基于页面滚动发起商品描述信息的加载, 通过protocol-htmlunit扩展处理可以实现此类页面数据抓取。 运行体验 由于Nutch运行是基于Unix/Linux环境的,请自行准备Unix/Linux系统或Cygwin运行环境。 git clone整个工程代码后,进行本地git下载目录: cd nutch-htmlunit/runtime/local bin/crawl urls crawl false 1 //urls参数为爬虫入库url文件目录; crawl为爬虫输出目录; false本应为solr索引url参数,此处设置为false不做solr索引处理; 1为爬虫执行回数 运行结束后可以看到天猫商品页面的价格/描述/滚动加载的图片等所有信息都已经完整获取到。 运行日志输入示例参考:http://git.oschina.net/xautlx/nutch-htmlunit/wikis/Log 扩展插件说明 protocol-htmlunit: 基于Htmlunit实现的AJAX页面Fetcher插件 parse-s2jh: 基于XPath解析页面元素内容; 基于数据库模式输出解析到结构化数据; 对于个别复杂类型AJAX页面定制判断页面加载完成的回调判断逻辑 index-s2jh: 追加设置需要额外传递给solr索引的属性数据; 设定不需要索引的页面规则; 欢迎关注作者其他项目: S2JH - 基于SSH的企业Web应用开发框架 12306 Hunter - (功能已失效不可用,不过还可以当作Swing开发样列参考只用)Java Swing C/S版本12306订票助手,用处你懂的 标签:nutch

61,110

社区成员

发帖
与我相关
我的任务
社区描述
层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。
社区管理员
  • HTML(CSS)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧