首页 > Web开发 > 详细

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

时间:2015-08-29 02:03:51      阅读:231      评论:0      收藏:0      [点我收藏+]

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

? ? ? ?很明显,我们要抓取的数据是
bubuko.com,布布扣
?打开谷歌浏览器的开发者工具,我们会发现,他其实是采用Ajax方式动态加载的,且采用的jsonp跨域方式返回的,分析如图:
bubuko.com,布布扣
?


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

? ? ? OK,回到主题,可能你还是第一次听说有个HtmlUnit这个玩意儿,有可能你是大咖早已听说,但我还是觉得还是官方的解释说明最权威,我就不瞎BB了,看图:
bubuko.com,布布扣
? ? ? 总之,一句话,HtmlUnit其实就是一个测试工具,方便测试人员进行功能测试,它能模拟诸如谷歌浏览器,火狐浏览器,IE浏览器等常见主流浏览器的行为。废话不多说,我直接上demo:

? ? ?

/**
 * 上海证券交易所数据抓取测试
 * @since 1.0
 * @author  Lanxiaowei@citic-finance.com
 * @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包如图:
bubuko.com,布布扣
? ? 就说这么多,如果有什么其他问题,请联系我,联系方式如下:
? ? ??益达的GitHub地址请猛戳我,用力,吃点劲儿!!!

?

?

?

?

??

?

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

原文:http://iamyida.iteye.com/blog/2238622

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!