益达教你如何抓取Ajax动态页面

标签: 益达 ajax 动态页面 | 发表时间:2015-08-28 10:40 | 作者:
出处:http://www.iteye.com

       何为Ajax动态网页,我想不用我多说了吧,如果你连Ajax是啥玩意儿都不知道,那你还是先去Google学习Ajax吧。为了形象起见,这里我以抓取这个网页为例进行讲解说明。网页链接如下:
        http://www.sse.com.cn/assortment/stock/list/name/

       很明显,我们要抓取的数据是

 打开谷歌浏览器的开发者工具,我们会发现,他其实是采用Ajax方式动态加载的,且采用的jsonp跨域方式返回的,分析如图:

 



 

 由此可以推断,分页部分信息是通过javaScript动态往DOM中插入的,如果你仅仅是通过类似HttpClient之类的工具来模拟Http请求来获取网页信息的话,你得到的网页内容将不是完整的,而HtmlUnit可以做到。

      OK,回到主题,可能你还是第一次听说有个HtmlUnit这个玩意儿,有可能你是大咖早已听说,但我还是觉得还是官方的解释说明最权威,我就不瞎BB了,看图:

      总之,一句话,HtmlUnit其实就是一个测试工具,方便测试人员进行功能测试,它能模拟诸如谷歌浏览器,火狐浏览器,IE浏览器等常见主流浏览器的行为。废话不多说,我直接上demo:

     

/**
 * 上海证券交易所数据抓取测试
 * @since 1.0
 * @author  [email protected]
 * @date    2015-8-27下午6:16:14
 *
 */
public class ShangHaiStockTest {
	public static void main(String[] args) throws Exception {
		WebClient webClient = new WebClient(BrowserVersion.FIREFOX_38);
	    webClient.getOptions().setCssEnabled(false);  
        webClient.getOptions().setJavaScriptEnabled(true);  
        webClient.getOptions().setActiveXNative(false);
        webClient.getOptions().setAppletEnabled(false);
        webClient.getOptions().setRedirectEnabled(false);
        webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        webClient.getOptions().setUseInsecureSSL(false);
        webClient.getOptions().setTimeout(10000000);
        webClient.setAjaxController(new NicelyResynchronizingAjaxController());
        
        int totalPage = 22;
        do {
        	HtmlPage page = (HtmlPage)webClient.getPage("http://www.sse.com.cn/assortment/stock/list/name/");
        	HtmlAnchor anchor = (HtmlAnchor) page.getHtmlElementById("xsgf_next");
            page = (HtmlPage) anchor.click();
            FileUtils.writeFile(page.asXml(), "C:/shh/list/" + totalPage + ".html", "UTF-8", false);
            totalPage--;
        } while(totalPage > 0);
	    
        //关闭模拟窗口  
        webClient.closeAllWindows();
	}
}

    关键点:

   1.webClient.getOptions().setJavaScriptEnabled(true);
     启用JavaScript

   2.webClient.setAjaxController(new NicelyResynchronizingAjaxController());

     设置Ajax异步处理控制器即启用Ajax支持

  3.webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);

     webClient.getOptions().setThrowExceptionOnScriptError(false);

     这两句很关键,前者表示当出现Http error时,程序不抛异常继续执行,后者表示当JavaScript执行出现异常时直接无视,否则Java代码会直接抛异常,程序中断。

    demo代码里演示了,如果通过代码去模拟点击“下一页”超链接去分页获取每一页的网页内容,然后写入磁盘指定目录。程序很简单,希望能抛砖引玉,程序依赖的jar包如图:

    就说这么多,如果有什么其他问题,请联系我,联系方式如下:
       益达的GitHub地址 请猛戳我,用力,吃点劲儿!!!

益达的新浪微博: 看这里,看这里

益达的技术交流社区: 码农们,I want you!!!

 

   益达Q-Q:                7-3-6-0-3-1-3-0-5

 

 

   益达的Q-Q群:      1-0-5-0-9-8-8-0-6

  

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [益达 ajax 动态页面] 推荐:

益达教你如何抓取Ajax动态页面

- - ITeye博客
       何为Ajax动态网页,我想不用我多说了吧,如果你连Ajax是啥玩意儿都不知道,那你还是先去Google学习Ajax吧. 为了形象起见,这里我以抓取这个网页为例进行讲解说明.        很明显,我们要抓取的数据是.  打开谷歌浏览器的开发者工具,我们会发现,他其实是采用Ajax方式动态加载的,且采用的jsonp跨域方式返回的,分析如图:.

原生AJAX

- - Web前端 - ITeye博客
对象是ajax的基础,几乎所有的浏览器都支持他,只是创建方式不同,如IE5,IE6. 2、AJAX - 向服务器发送请求请求. 与 POST 相比,GET 更简单也更快,并且在大部分情况下都能用. 然而,在以下情况中,请使用 POST 请求:. 无法使用缓存文件(更新服务器上的文件或数据库). 向服务器发送大量数据(POST 没有数据量限制).

初识Ajax

- - CSDN博客推荐文章
Ajax(Asynchronous JavaScript and XMLS异步JavaScript和XML)(“阿贾克斯”)技术. 完成页面的局部刷新,从而提升操作性能. AJAX 不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的 Web 应用程序的技术. 依赖的核心对象:XMLHttpRequest.

jquery ajax 跨域请求

- - 博客园_首页
使用 jquery 中的ajax  进行跨域请求. 说明:dataType 为  "jsonp"  ;type 只能为 GET.                    //处理错误. 后台处理代码 ValidAccountsExists.aspx.

ajax核心js代码

- - ITeye博客
                         //针对firefox,mozillar,opera,safari,IE7,IE8.                          //针对某些特定版本的mozillar浏览器的bug进行修正.                          //针对IE6,IE5.5,IE5.

反向Ajax,第1部分:Comet介绍

- 茫茫 - 译言-每日精品译文推荐
来源Reverse Ajax, Part 1: Introduction to Comet. web开发在过去的几年中有了很大的进展,我们已经远超了把静态网页链接在一起的做法,这种做法会引起浏览器的刷新,并且要等待页面的加载. 现在需要的是能够通过web来访问的完全动态的应用,这些应用通常需要尽可能的快,提供近乎实时的组件.

ajax后退解决方案(一)

- We_Get - 博客园-首页原创精华区
一、使用iframe,通过document.write产生历史. . 点击按钮后更新页面DOM(模拟ajax提交),会发现浏览器后退按钮可用了. 这种方式缺点是只支持IE和Firefox. 作者: snandy 发表于 2011-09-18 08:42 原文链接.

反向Ajax,第2部分:WebSocket

- KnightE - 译言-电脑/网络/数码科技
来源Reverse Ajax, Part 2: WebSockets. 时至今日,用户期待的是可通过web访问快速、动态的应用. 这一文章系列展示了如何使用反向Ajax(Reverse Ajax)技术来开发事件驱动的web应用. 系列的第1部分介绍了反向Ajax、轮询(polling)、流(streaming)、Comet和长轮询(long polling).

一次Ajax查错的经历

- - 酷壳 - CoolShell.cn
我有一朋友做网站,用jQuery的Ajax方法从后端载入一段HTML代码然后动态插入到网页的Div元件中. jQuery强大的load方法可以完成这个事情. 在Chrome,Firefox,Safari下运行一点问题也没有,只有IE不行,不管是IE7,IE8,还是IE9. 问题的症壮是,使用IE访问那个Ajax的链接,没有问题,但是在jQuery的Ajax方法返回了“undefined”的respons对象.

ajax与HTML5 history pushState/replaceState实例

- - 张鑫旭-鑫空间-鑫生活
本文地址: http://www.zhangxinxu.com/wordpress/?p=3432. 我就TM想找个例子,知道如何个使用,使用语法什么的滚粗. 精力总是有限的,昨天一冲动,在上海浦东外环之外订了个90米的房子,要借钱筹首付、贷款和领证什么的. HTML5 history相关知识点啪啦啪啦讲起来也是一条又臭又长的裹脚布,精气神实在不够用,这里,直接一个实例.