`
yy8354
  • 浏览: 79168 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

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

}

分享到:
评论
7 楼 xiang861206 2011-03-04  
用navigation.loadURI()加载时,要是https协议的就不行
6 楼 mashimaro 2010-03-11  
希望能得到解答 谢谢
5 楼 mashimaro 2010-03-11  
这是什么原因啊
public void onStateChange(ProgressEvent event) {
if (!event.isLoadingDocument()) {
if (done)
return;
done = true;
}
}
这段代码中,怎么判断浏览器是否加载完啊 event.isLoadingDocument这个方法的原理是什么
4 楼 mashimaro 2010-03-11  
我看到浏览器中 由JS动态生成的一部分内容也没显示出 来
3 楼 mashimaro 2010-03-11  
你好 这个程序是不是说 等页面内的所有JS都加载完后 生成了HTML后 可获得的源码啊 但是 为什么我得到的仍然是静态的源码呢
2 楼 yy8354 2009-04-22  
这里只是得到渲染后的代码 不代表任何动态信息都能得到 首先这部分信息必须会被渲染 同时渲染以后生成了HTML代码 你才可能获取
比如说是鼠标移动到上面才显示的内容 首先你得保证它先显示出来 显示出来的时候浏览器才等于渲染出了这个内容 这时候获取渲染后代码 才能得到它的内容 所以第二篇研究的就是怎么调用DOM元素的事件响应 这样可以模拟用户操作来让浏览器进行JS处理和对应HTML渲染
1 楼 cynthia2009 2009-04-20  
最近在学习您讲的这个方法,但是我调通之后,动态信息返回值仍然为空,还在研究中。
不知道您是否遇到此种情况,但愿能得您点播一下。 

相关推荐

    JRex java webbrowser 爬虫ajax网页 源码

    一般在浏览器中查看页面代码 是浏览器直接下载到的页面代码 在未经渲染前 对于JS AJAX输出的内容是无法得到的 这样我们得到的页面内容和直接走socket抓取回来无任何区别 还是无法得到需要的页面内容。 JS函数及页面...

    JRex 爬虫ajax网页 API文档

    一般在浏览器中查看页面代码 是浏览器直接下载到的页面代码 在未经渲染前 对于JS AJAX输出的内容是无法得到的 这样我们得到的页面内容和直接走socket抓取回来无任何区别 还是无法得到需要的页面内容。 JS函数及页面...

    Gecko

    Gecko

    gecko-sdk.rar_Gecko SDK_gecko

    测试,Gecko SDK 支持win7,最新版本

    GeckoBrowser_delphi_gecko_browser_

    gecko browser for delphi application and control

    geckodriver

    geckodriver geckodriver geckodriver geckodriver

    Gecko浏览器内核

    Gecko(Firefox内核) Gecko:Netscape6开始采用的内核,后来的Mozilla FireFox(火狐浏览器) 也...Gecko内核常见的浏览器:[1] Mozilla Firefox、Mozilla SeaMonkey、Epiphany(早期版本)、Flock(早期版本)、K-Meleon

    geckodriver-v0.14.0

    geckodriver-v0.14.0 支持linux和windows 64位

    软件测试geckodriver驱动安装包

    geckodriver.exe是一个驱动程序,用于在Firefox浏览器中运行Selenium测试脚本。geckodriver.exe是Mozilla Gecko浏览器引擎的一部分,它充当Selenium WebDriver与Firefox浏览器之间的桥梁,用于实现Selenium测试脚本...

    android基于gecko引擎的浏览器示例

    在android上基于gecko引擎的浏览器简单实现,解决在低版本android系统webview对ES6支持不好的问题。

    geckodriver.exe4个版本下载

    由于webdriver在不同的firefox版本中,需要的geckodriver.exe版本也不同,所以需要对照版本下载不同的geckodriver.exe,资源中包括了geckodriver.exe 15、16、19、23 4个版本的资源

    geckodriver 64位

    geckodriver 64位

    geckodriver-0.21.0

    火狐浏览器用可执行程序GeckoDriver.exe的方式执行WebDriver协议。所有的测试脚本都通过GeckoDriver来执行

    geckodriver-v0.29.1-win32和64.zip

    geckodriver-v0.29.1-win32和64.zip

    geckodriver-v0.11.1-win32位

    python selenim 报错: 'geckodriver' executable needs to be in PATH需下载geckodriver解压放在C:\Python27即可

    skybound.gecko.rar

    skybound.gecko.dll文件,skybound.gecko.dll文件 skybound.gecko.dll文件免费下载

    geckodriver-v0.29.1-win32.zip

    Selenium3爬虫需要的火狐Firefox驱动器geckodriver windows 32位

    geckodriver 32位

    selenium3对火狐浏览器需要geckodriver

    geckodriver.exe

    java.lang.IllegalStateException: The path to the driver executable must be set by the webdriver.gecko.driver system property; for more information, see ...

Global site tag (gtag.js) - Google Analytics