益达教你如何抓取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:
public class ShangHaiStockTest { public static void main(String[] args) throws Exception { downloadListPage(); } public static void downloadListPage() 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; boolean first = true; HtmlPage page = null; do { if(first) { page = (HtmlPage)webClient.getPage("http://www.sse.com.cn/assortment/stock/list/name/"); FileUtils.writeFile(page.asXml(), "C:/shh/list/" + totalPage + ".html", "UTF-8", false); first = false; } else { HtmlAnchor anchor = null; if(totalPage == 22 -1) { anchor = (HtmlAnchor) page.getHtmlElementById("xsgf_next"); } else { anchor = (HtmlAnchor) page.getHtmlElementById("dateList_container_next"); } page = (HtmlPage) anchor.click(); FileUtils.writeFile(page.asXml(), "C:/shh/list/" + totalPage + ".html", "UTF-8", false); } totalPage--; } while(totalPage 0); //关闭模拟窗口 webClient.closeAllWindows(); }
启用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 请求并抓取今日头条街拍美图 首先分析街拍图集的网页请求头部: 在 preview 选项卡我们可以找到 json 文件,分析 data 选项,找到我们要找到的图集地址 article_url: 选中其中一张图片,分析 json 请求,可以找到图片地址在 gallery 一栏: 找到图片地址,接下来我们就可以来写代码了:
C#抓取AJAX页面的内容 原文 C#抓取AJAX页面的内容 现在的网页有相当一部分是采用了AJAX技术,所谓的AJAX技术简单一点讲就是事件驱动吧(当然这种说法可能很不全面),在你提交了URL后,服务器发给你的并不是所有是页面内容,而有一大部分是JS脚本,即用
相关文章
- ajax跨域的解决办法_java如何解决跨域问题
- ajax跨域解除方案,关于Ajax跨域问题及解决方案详析「建议收藏」
- ajax请求的五个步骤java_如何发送ajax请求?ajax请求的五个步骤详解[通俗易懂]
- ajax怎么解决报414,如何解决HTTP 414“请求URI太长”错误?
- Vue通过axios发送ajax请求
- jQuery中AJAX写法「建议收藏」
- Web阶段:第二十章:Ajax请求
- AJAX
- js操作元素属性_如何将ajax返回的网页加载出来
- jQuery的ajax巧妙利用详解编程语言
- 如何解决ajax跨域问题json和jsonp详解编程语言
- 使用Ajax轻松访问和操作MySQL数据库(ajax访问mysql)
- 数据通过Ajax加载MySQL数据(ajax获取mysql)
- Ajax注册MySQL极速轻量注册引擎(ajax注册mysql)
- 探究Ajax的MySQL驱动原理(ajax原理 mysql)
- ajax的responseXML返回接受asp
- 从Ajax到JQueryAjax学习
- ASP.NET(AJAX+JSON)实现对象调用
- Ajax添加数据即时显示信息篇
- AJAX分页的代码(后台asp.net)
- AJAX中文乱码PHP中完美解决方法
- Ajax说的比较清楚的一篇文章
- 探讨在JQuery和Js中,如何让ajax执行完后再继续往下执行
- php中如何判断一个网页请求是ajax请求还是普通请求
- 如何在前台脚本通过json传递数据到后台(使用微软自带的ajax)
- 如何将ajax请求返回的Json格式数据循环输出成table形式
- 浅谈AJAX开发技术