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

简介:

何为Ajax动态网页,我想不用我多说了吧,如果你连Ajax是啥玩意儿都不知道,那你还是先去Google学习Ajax吧。这里我以抓取这个网页为例进行讲解说明。

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

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

 



 

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

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

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

   

Java代码  收藏代码

  1. /** 
  2. * 上海证券交易所数据抓取测试 
  3. * @since 1.0 
  4. * @author  Lanxiaowei@citic-finance.com 
  5. * @date    2015-8-27下午6:16:14 
  6. * 
  7. */  
  8. public class ShangHaiStockTest {  
  9.    public static void main(String[] args) throws Exception {  
  10.        downloadListPage();  
  11.    }  
  12.      
  13.    public static void downloadListPage() throws Exception {  
  14.        WebClient webClient = new WebClient(BrowserVersion.FIREFOX_38);  
  15.        webClient.getOptions().setCssEnabled(false);    
  16.        webClient.getOptions().setJavaScriptEnabled(true);    
  17.        webClient.getOptions().setActiveXNative(false);  
  18.        webClient.getOptions().setAppletEnabled(false);  
  19.        webClient.getOptions().setRedirectEnabled(false);  
  20.        webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);  
  21.        webClient.getOptions().setThrowExceptionOnScriptError(false);  
  22.        webClient.getOptions().setUseInsecureSSL(false);  
  23.        webClient.getOptions().setTimeout(10000000);  
  24.        webClient.setAjaxController(new NicelyResynchronizingAjaxController());  
  25.          
  26.        int totalPage = 22;  
  27.        boolean first = true;  
  28.        HtmlPage page = null;  
  29.        do {  
  30.            if(first) {  
  31.                page = (HtmlPage)webClient.getPage("http://www.sse.com.cn/assortment/stock/list/name/");  
  32.                FileUtils.writeFile(page.asXml(), "C:/shh/list/" + totalPage + ".html", "UTF-8", false);  
  33.                first = false;  
  34.            } else {  
  35.                HtmlAnchor anchor = null;  
  36.                if(totalPage == 22 -1) {  
  37.                    anchor = (HtmlAnchor) page.getHtmlElementById("xsgf_next");  
  38.                } else {  
  39.                    anchor = (HtmlAnchor) page.getHtmlElementById("dateList_container_next");  
  40.                }  
  41.                page = (HtmlPage) anchor.click();  
  42.                FileUtils.writeFile(page.asXml(), "C:/shh/list/" + totalPage + ".html", "UTF-8", false);  
  43.            }  
  44.              
  45.            totalPage--;  
  46.        } while(totalPage > 0);  
  47.          
  48.        //关闭模拟窗口    
  49.        webClient.closeAllWindows();  
  50.    }  
  51. }  

   关键点:

  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地址请猛戳我,用力,吃点劲儿!!!

转载:http://iamyida.iteye.com/blog/2238622

目录
相关文章
|
8月前
|
JavaScript 前端开发 容器
AJAX载入外部JS文件到页面并让其执行的方法(附源码)
AJAX载入外部JS文件到页面并让其执行的方法(附源码)
76 0
|
3月前
|
前端开发 JavaScript
回顾前端页面发送ajax请求方式
回顾前端页面发送ajax请求方式
44 18
|
7月前
|
数据采集 Web App开发 前端开发
技术心得记录:如何用JAVA爬取AJAX加载后的页面(转载)
技术心得记录:如何用JAVA爬取AJAX加载后的页面(转载)
|
XML JSON 前端开发
异步请求,局部更新页面------Ajax
异步请求,局部更新页面------Ajax
98 0
ajax+json模拟一个页面多个统计图数据交互
ajax+json模拟一个页面多个统计图数据交互
52 1
|
8月前
|
存储 移动开发 JavaScript
【原生】sd.js帮助您简化繁重的获取数据、存储数据(CRUD)骚操作(吐槽~在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据)
【原生】sd.js帮助您简化繁重的获取数据、存储数据(CRUD)骚操作(吐槽~在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据)
|
前端开发
Ajax提交请求后台返回一个完整的html页面
Ajax提交请求后台返回一个完整的html页面
108 0
|
前端开发 JavaScript Java
SSM框架用Ajax增删改查一个页面(简单易懂)
SSM框架用Ajax增删改查一个页面(简单易懂)
|
前端开发
如何对ajax请求的后台数据添加到swiper轮播图并展示到页面
如何对ajax请求的后台数据添加到swiper轮播图并展示到页面
157 0
|
Web App开发 前端开发 API
ajax-hook+ selenium抓取带参数的 Ajax 数据
ajax-hook+ selenium抓取带参数的 Ajax 数据
160 0