Gecko(jrex)研究记录 JS AJAX页面内容抓取处理(1)
编程技术  /  houtizong 发布于 3年前   77
为了解决JS AJAX网站问题必须一个能够模拟用户操作行为来得到页面上数据的展示,在模拟用户行为上我们需要解决两件事情:
1、得到渲染后的网页HTML代码 一般在浏览器中查看页面代码 是浏览器直接下载到的页面代码 在未经渲染前 对于JS AJAX输出的内容是无法得到的 这样我们得到的页面内容和直接走socket抓取回来无任何区别 还是无法得到需要的页面内容
2、JS函数及页面元素事件的调用 这些很简单都是依靠用户的EVENT去驱动的,而我们通过SOCKET抓取页面对我们只是流而已无法去模拟用户的EVENT 没有这些EVENT 页面上需要EVENT驱动而展现的内容连显示都不可能 更无从抓取了
在windows下通过WEBBROWSER控件,我们能很简单的解决以上两个问题,但LINUX下暂时只能依赖于FIREFOX内核GECKO想办法了。由于使用JAVA作为开发语言,我们使用了JREX的JAR包,它包装了GECKO的DLL进行本地化调用,可以使我们直接使用JAVA语言来使用GECKO。
核心部分就是对通过JRexCanvas得到一个Document对象转换为DocumentRange然后利用它自带的方法createRange得到渲染后的页面内容(如果熟悉WEBBROWSER的同志们会发现基本很多类名方法名很相似,不过就是JREX缺乏文档只能自己瞎折腾了)
Document doc =navigation.getDocument();
DocumentRange range=((org.mozilla.jrex.dom.JRexDocumentImpl)doc).getDocumentRange();
System.out.println(xmlToString(range.createRange().getCommonAncestorContainer())); 与WEBBROWSER不同没有createTXTRange()方法来直接得到纯的HTML文本,所以只能得到NODE 然后自己去处理
辅助函数用来输出NODE:
public static String xmlToString(Node node) throws Exception {
Source source = new DOMSource(node);
StringWriter stringWriter = new StringWriter();
Result result = new StreamResult(stringWriter);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.setOutputProperty(OutputKeys.METHOD, "html");
transformer.transform(source, result);
return stringWriter.getBuffer().toString();
}
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成
网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];
文章归档
文章标签
友情链接