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

 何为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:

     

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

时间: 2024-09-25 03:34:48

益达教你如何抓取Ajax动态页面的相关文章

如何让搜索引擎抓取AJAX内容

越来越多的网站,开始采用"单页面结构"(Single-page application). 整个网站只有一张网页,采用Ajax技术,根据用户的输入,加载不同的内容. 这种做法的好处是用户体验好.节省流量,缺点是AJAX内容无法被搜索引擎抓取.举例来说,你有一个网站. http://example.com 用户通过井号结构的URL,看到不同的内容. http://example.com#1 http://example.com#2 http://example.com#3 但是,搜索引擎

如何让搜索引擎抓取AJAX内容解决方案_php实例

越来越多的网站,开始采用"单页面结构"(Single-page application). 整个网站只有一张网页,采用Ajax技术,根据用户的输入,加载不同的内容. 这种做法的好处是用户体验好.节省流量,缺点是AJAX内容无法被搜索引擎抓取.举例来说,你有一个网站. http://example.com 用户通过井号结构的URL,看到不同的内容. http://example.com#1 http://example.com#2 http://example.com#3 但是,搜索引擎

使用php方法curl抓取AJAX异步内容思路分析及代码分享_php实例

其实抓ajax异步内容的页面和抓普通的页面区别不大.ajax只不过是做了一次异步的http请求,只要使用firebug类似的工具,找到请求的后端服务url和传值的参数,然后对该url传递参数进行抓取即可. 利用Firebug的网络工具                                                               如果抓去的是页面,则内容中没有显示的数据,是一堆JS代码. Code                                    

如何让搜索引擎抓取AJAX内容?

越来越多的网站,开始采用"单页面结构"(Single-page application). 整个网站只有一张网页,采用Ajax技术,根据用户的输入,加载不同的内容. 这种做法的好处是用户体验好.节省流量,缺点是AJAX内容无法被搜索引擎抓取.举例来说,你有一个网站. http://example.com 用户通过井号结构的URL,看到不同的内容. http://example.com#1 http://example.com#2 http://example.com#3 但是,搜索引擎

PHP curl 抓取AJAX异步内容示例_php技巧

其实抓ajax异步内容的页面和抓普通的页面区别不大.ajax只不过是做了一次异步的http请求,只要使用firebug类似的工具,找到请求的后端服务url和传值的参数,然后对该url传递参数进行抓取即可. 利用Firebug的网络工具 如果抓去的是页面,则内容中没有显示的数据,是一堆JS代码. Code $cookie_file=tempnam('./temp','cookie'); $ch = curl_init(); $url1 = "http://www.cdut.edu.cn/defau

如何用java抓取ajax页面的内容?

问题描述 如何用java抓取ajax页面的内容?例如这个页面: http://app.abchina.com/branch/ 中的营业结构查询思路是什么,希望大家给出解答,谢谢! 问题补充:wangqj 写道 解决方案 用htmlparser就可以了,你不用管ajax,和正常页面一样抓就行.实际上你只要知道你要抓取的页面的网址就可以了

C#抓取AJAX页面的内容

原文 C#抓取AJAX页面的内容 现在的网页有相当一部分是采用了AJAX技术,所谓的AJAX技术简单一点讲就是事件驱动吧(当然这种说法可能很不全面),在你提交了URL后,服务器发给你的并不是所有是页面内容,而有一大部分是JS脚本,即用<JAVASCRIPT标签表示的,这其中有些是链接了外部的JS文件,有些是内置的JS脚本,这些脚本是在客户端加载了服务器发回来的源码后才执行的,所以不管是采用C#中的WebClient还是HttpRequest都得不到正确的结果,因为这些脚本是在服务器发送完毕后才执

通过抓取淘宝评论为例讲解Python爬取ajax动态生成的数据(经典)_AJAX相关

在学习python的时候,一定会遇到网站内容是通过 ajax动态请求.异步刷新生成的json数据 的情况,并且通过python使用之前爬取静态网页内容的方式是不可以实现的,所以这篇文章将要讲述如果在python中爬取ajax动态生成的数据. 至于读取静态网页内容的方式,有兴趣的可以查看本文内容. 这里我们以爬取淘宝评论为例子讲解一下如何去做到的. 这里主要分为了四步: 一 获取淘宝评论时,ajax请求链接(url) 二 获取该ajax请求返回的json数据 三 使用python解析json数据

如何抓取百度知道页面里面问题答案的 ‘评论’ 信息。。

问题描述 如何抓取百度知道页面里边问题答案的'评论'信息.现在我用jsoup能抓到整个页面,但是评论内容是要通过点击'评论'才能加载下面内容.所以现在无法获取评论信息.我用phantomjs模拟浏览器来点击评论,但貌似无法成功.然后现在怀疑这种方法是否可行.求大神指导或者推荐其他方法.... 解决方案 解决方案二:模拟浏览器的点击可以不解决方案三:没用过phantomjs."但是评论内容是要通过点击'评论'才能加载下面内容.所以现在无法获取评论信息"看了一下这个功能是通过ajax来加载