何为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. public static void downloadListPage() throws Exception {
  13. WebClient webClient = new WebClient(BrowserVersion.FIREFOX_38);
  14. webClient.getOptions().setCssEnabled(false);
  15. webClient.getOptions().setJavaScriptEnabled(true);
  16. webClient.getOptions().setActiveXNative(false);
  17. webClient.getOptions().setAppletEnabled(false);
  18. webClient.getOptions().setRedirectEnabled(false);
  19. webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
  20. webClient.getOptions().setThrowExceptionOnScriptError(false);
  21. webClient.getOptions().setUseInsecureSSL(false);
  22. webClient.getOptions().setTimeout(10000000);
  23. webClient.setAjaxController(new NicelyResynchronizingAjaxController());
  24. int totalPage = 22;
  25. boolean first = true;
  26. HtmlPage page = null;
  27. do {
  28. if(first) {
  29. page = (HtmlPage)webClient.getPage("http://www.sse.com.cn/assortment/stock/list/name/");
  30. FileUtils.writeFile(page.asXml(), "C:/shh/list/" + totalPage + ".html", "UTF-8", false);
  31. first = false;
  32. } else {
  33. HtmlAnchor anchor = null;
  34. if(totalPage == 22 -1) {
  35. anchor = (HtmlAnchor) page.getHtmlElementById("xsgf_next");
  36. } else {
  37. anchor = (HtmlAnchor) page.getHtmlElementById("dateList_container_next");
  38. }
  39. page = (HtmlPage) anchor.click();
  40. FileUtils.writeFile(page.asXml(), "C:/shh/list/" + totalPage + ".html", "UTF-8", false);
  41. }
  42. totalPage--;
  43. } while(totalPage > 0);
  44. //关闭模拟窗口
  45. webClient.closeAllWindows();
  46. }
  47. }

关键点:

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

益达教你如何抓取Ajax动态页面相关推荐

  1. C#利用phantomJS抓取AjAX动态页面

    在C#中,一般常用的请求方式,就是利用HttpWebRequest创建请求,返回报文.但是有时候遇到到动态加载的页面,却只能抓取部分内容,无法抓取到动态加载的内容. 如果遇到这种的话,推荐使用phan ...

  2. scrapy实战5 POST方法抓取ajax动态页面(以慕课网APP为例子):

    在手机端打开慕课网,fiddler查看如图注意圈起来的位置 经过分析只有画线的page在变化 上代码: items.py 1 import scrapy 2 3 4 class ImoocItem(s ...

  3. python爬虫抓取动态网页数据_python网络爬虫抓取ajax动态网页数据:以抓取KFC门店地址为例...

    一,尝试用BeautifulSoup抓取 先打开KFC网站门店列表页面:http://www.kfc.com.cn/kfccda/storelist/index.aspx 可以看到门店列表如下图: 打 ...

  4. 谈谈如何抓取ajax动态网站

    什么是ajax呢,简单来说,就是加载一个网页完毕之后,有些信息你你还是看不到,需要你点击某个按钮才能看到数据,或者有些网页是有很多页数据的,而你在点击下一页的时候,网页的url地址没有变化,但是内容变 ...

  5. scrapy由浅入深(三) selenium模拟爬取ajax动态页面(智联招聘)

    爬取智联招聘的网址:https://sou.zhaopin.com/?pageSize=60&jl=489&kw=python&kt=3 上一篇博客爬取了前程无忧的职位招聘信息 ...

  6. js动态渲染html页面,利用Scrapy-Splash抓取JS动态渲染的网页数据

    随着越来越多的网站开始用JS在客户端浏览器动态渲染网站,导致很多我们需要的数据并不能由原始的html中获取,再加上Scrapy本身并不提供JS渲染解析的功能,通常对这类网站数据的爬取我们一般采用两种方 ...

  7. python selenium 爬取js加载的内容为空,Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容...

    1,引言 在Python网络爬虫内容提取器一文我们详细讲解了核心部件:可插拔的内容提取器类gsExtractor.本文记录了确定gsExtractor的技术路线过程中所做的编程实验.这是第二部分,第一 ...

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

    2019独角兽企业重金招聘Python工程师标准>>> 越来越多的网站,开始采用"单页面结构"(Single-page application). 整个网站只有一 ...

  9. 用C#抓取AJAX页面的内容

    用C#抓取AJAX页面的内容[转] 现在的网页有相当一部分是采用了AJAX技术,不管是采用C#中的WebClient还是HttpRequest都得不到正确的结果,因为这些脚本是在服务器发送完毕后才执行 ...

最新文章

  1. TCMalloc:线程缓存的Malloc
  2. python隐藏部分代码_python隐藏类中属性的3种实现方法
  3. 贵州2021高考状元成绩查询,2021年贵州高考最高分多少分,历年贵州高考状元
  4. 关于KVM的几篇细节文档
  5. Swift-binary search tree
  6. 【总结】C++逻辑与或
  7. 在 PyCharm 中写代码
  8. 评估数据库存储引擎的黄金三角
  9. Linux 之 NTP 服务 服务器
  10. mysql一对多前端实现_django一对多模型以及如何在前端实现详解
  11. 掌握6大技巧,让python编程健步如飞!
  12. CAN为什么会发送失败
  13. 移动端登录页样式错乱_手机登录界面样式设计启示
  14. 【每周一个小技能】Obsidian配合Git实现笔记自动同步
  15. 【项目篇-资料获取】怎么获取创新创业比赛资料、优秀作品?如何去借鉴?
  16. 百思不得其解的Failed to allocate a managed memory buffer of 268435456 bytes.错误解决
  17. Map阶段分析之Spill阶段
  18. 华硕(ASUS)魔霸系列出厂系统Iwin10/11原厂OEM系统
  19. 《图形图像处理》课程项目设计任务书
  20. mac隐藏文件及查看隐藏文件

热门文章

  1. 【Pandas数据处理100例】(三十一):Pandas读取Excel(xlsx)表格文件
  2. 4.16-4.18 transition-group动画(卡片排序),忍让,谦逊,前进。
  3. 我喜欢计算机职业200字,爱玩电脑的我作文200字
  4. ZZULI郑州轻工业大学21级新生赛正式赛
  5. 光纤工程的,光纤熔接,光纤测试
  6. python开发跟淘宝有关联微_基于Python的Apriori和FP-growth关联分析算法分析淘宝用户购物关联度...
  7. 分析与设计:图书管理系统
  8. Office365完整离线安装包下载及自定义安装教程
  9. 分享画中画制作剪辑技巧
  10. Android技术点总结