当前位置: 首页 > 工具软件 > JRex > 使用案例 >

Gecko(jrex)研究记录 JS AJAX页面内容抓取处理(1)

姬庆
2023-12-01

为了解决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();

}

 类似资料: