/** *网上关于网络爬虫实现方式有很多种,但是很多都不支持Ajax,李兄说:模拟才是王道。确实, *如果能够模拟一个没有界面的浏览器,还有什么不能做到的呢?关于解析Ajax网站的框架也有不少, *我选择了HtmlUnit,官方网站:http://htmlunit.sourceforge.net/?,htmlunit可以说是一个Java *版本的无界面浏览器,几乎无所不能,而且很多东西都封装得特别完美。这是这几天来积累下来的心血,记录一下 */ package com.lanyotech.www.wordbank; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import java.util.List; import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController; import com.gargoylesoftware.htmlunit.ScriptResult; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlOption; import com.gargoylesoftware.htmlunit.html.HtmlPage; import com.gargoylesoftware.htmlunit.html.HtmlSelect; public class WorldBankCrawl { private static String TARGET_URL = “http://databank.worldbank.org/ddp/home.do”; public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException { //模拟一个浏览器 WebClient webClient = new WebClient(); //设置webClient的相关参数 webClient.setJavaScriptEnabled(true); webClient.setCssEnabled(false); webClient.setAjaxController(new NicelyResynchronizingAjaxController()); webClient.setTimeout(35000); webClient.setThrowExceptionOnScriptError(false); //模拟浏览器打开一个目标网址 HtmlPage rootPage= webClient.getPage(TARGET_URL); //获取第一个数据库 HtmlSelect hs = (HtmlSelect) rootPage.getElementById("lstCubes"); //按要求选择第一个数据库 hs.getOption(0).setSelected(true); //模拟点击Next按钮,跳转到第二个页面 System.out.println("正在跳转…"); //执行按钮出发的js事件 ScriptResult sr = rootPage.executeJavaScript("javascript:setCubeData(2,-1,4,’/ddp');"); //跳转到第二个页面,选择国家 HtmlPage countrySelect = (HtmlPage) sr.getNewPage(); //获得包含全部国家信息的选择框页面 HtmlPage framePage=(HtmlPage)countrySelect.getFrameByName("frmTree1″).getEnclosedPage(); //获得selectAll按钮,触发js事件 framePage.executeJavaScript("javascript:TransferListAll('countrylst’,'countrylstselected’,'no');SetSelectedCount('countrylstselected’,'tdcount');"); //获取Next按钮,触发js事件 ScriptResult electricityScriptResult = framePage.executeJavaScript("javascript:wrapperSetCube('/ddp')"); System.out.println("正在跳转…"); //跳转到下一个页面electricitySelect HtmlPage electricitySelect = (HtmlPage) electricityScriptResult.getNewPage(); //获得electricity选择的iframe HtmlPage electricityFrame = (HtmlPage) electricitySelect.getFrameByName("frmTree1″).getEnclosedPage(); //获得选择框 HtmlSelect seriesSelect = (HtmlSelect) electricityFrame.getElementById("countrylst"); //获得所有的选择框内容 List optionList = seriesSelect.getOptions(); //将指定的选项选中 optionList.get(1).setSelected(true); //模拟点击select按钮 electricityFrame.executeJavaScript("javascript:TransferList('countrylst’,'countrylstselected’,'no');SetSelectedCount('countrylstselected’,'tdcount');"); //获取选中后,下面的选择框 HtmlSelect electricitySelected = (HtmlSelect) electricityFrame.getElementById("countrylstselected"); List list = electricitySelected.getOptions(); //模拟点击Next按钮,跳转到选择时间的页面 ScriptResult timeScriptResult = electricityFrame.executeJavaScript("javascript:wrapperSetCube('/ddp')"); System.out.println("正在跳转…"); HtmlPage timeSelectPage = (HtmlPage) timeScriptResult.getNewPage(); //获取选中时间的选择框 timeSelectPage = (HtmlPage) timeSelectPage.getFrameByName("frmTree1″).getEnclosedPage(); //选中所有的时间 timeSelectPage.executeJavaScript("javascript:TransferListAll('countrylst’,'countrylstselected’,'no');SetSelectedCount('countrylstselected’,'tdcount');"); //点击Next按钮 ScriptResult exportResult = timeSelectPage.executeJavaScript("javascript:wrapperSetCube('/ddp')"); System.out.println("正在跳转…"); //转到export页面 HtmlPage exportPage = (HtmlPage) exportResult.getNewPage(); //点击页面上的Export按钮,进入下载页面 ScriptResult downResult = exportPage.executeJavaScript("javascript:exportData('/ddp’ ,’EXT_BULK’ ,’WDI_Time=51||WDI_Series=1||WDI_Ctry=244||’ );"); System.out.println("正在跳转…"); HtmlPage downLoadPage = (HtmlPage) downResult.getNewPage(); //点击Excel图标,开始下载 ScriptResult downLoadResult = downLoadPage.executeJavaScript("javascript:exportData('/ddp’,'BULKEXCEL');"); //下载Excel文件 InputStream is = downLoadResult.getNewPage().getWebResponse().getContentAsStream(); OutputStream fos = new FileOutputStream("d://test.xls"); byte[] buffer=new byte[1024*30]; int len=-1; while((len=is.read(buffer))>0){ fos.write(buffer, 0, len); } fos.close(); fos.close(); System.out.println("Success!"); } }
相关推荐
protocol-htmlunit: 基于Htmlunit实现的AJAX页面Fetcher插件 parse-s2jh: 基于XPath解析页面元素内容; 基于数据库模式输出解析到结构化数据; 对于个别复杂类型AJAX页面定制判断页面加载完成的回调...
【标题】"基于Apache Nutch和Htmlunit的扩展实现AJAX页面爬虫抓取解析插件.zip" 提供了一个深入的爬虫项目实例,旨在解决AJAX动态网页内容的抓取问题。Apache Nutch是一个开源的网络爬虫框架,而Htmlunit是一个无头...
这个"HtmlUnit爬虫Demo"可能是一个示例项目,展示了如何利用HtmlUnit库进行网络爬虫开发。以下是对HtmlUnit库及其在爬虫中的应用进行的详细说明。 **HtmlUnit简介** HtmlUnit是一个无头浏览器,意味着它没有图形...
在这个“网络爬虫实现源码”中,我们主要关注的是利用Jsoup和HtmlUnit这两个Java库来构建爬虫引擎,以及如何从网站上获取图片地址信息。 Jsoup是一个流行的Java库,用于解析HTML文档。它的主要功能包括提取结构化...
在“htmlunit爬虫技术”中,我们将深入探讨如何利用HTMLUnit来实现高效的网络爬虫。 HTMLUnit的核心特性包括: 1. **JavaScript支持**:HTMLUnit能够执行JavaScript代码,这对于许多动态加载内容的现代网站来说至...
HTMLUnit是一款功能强大的Java库,它模拟了一个无头Web浏览器,特别适用于自动化测试和网络爬虫。这个压缩包“htmlunit”很可能包含了HTMLUnit的核心库和其他相关依赖,使得开发者能够轻松地在Java项目中集成...
这个库在进行网络爬虫或自动化测试时非常有用,因为它可以解析HTML、执行JavaScript,甚至处理AJAX请求,而无需打开实际的浏览器。标题中的"com.gargoylesoftware.htmlunit-2.29所需包"表明这是HTMLUnit库的特定版本...
2. **HttpClient库**:HTMLUnit基于Apache HttpClient库进行HTTP通信,该库处理网络请求和响应,是实现网络爬虫的基础。 3. **Jsoup库**:可能包含Jsoup,这是一个解析和操作HTML的Java库,HTMLUnit可能使用它来...
标题中的“爬虫工具htmlunit,selenium,beautifulsoup”提到了三种在Web爬虫开发中常用的库。接下来,我们将详细探讨这三个工具的功能、用法以及它们在爬虫技术中的重要性。 1. **HtmlUnit**: HtmlUnit是一个...
7. 利用HTMLUnit的异步功能处理AJAX请求,等待页面完全加载。 HTMLUnit的一个显著优点是它的速度,因为不需要启动真正的浏览器实例,所以执行速度比使用Selenium等其他工具要快得多。然而,由于它是一种无头浏览器...
网上关于网络爬虫实现方式有很多种,但是很多都不支持Ajax,李兄说:模拟才是王道。确实,如果能够模拟一个没有界面的浏览器,还有什么不能做到的呢? 关于解析Ajax网站的框架也有不少,我选择了HtmlUnit
这个“htmlunit-2.8(api文档).zip”压缩包包含了HTMLUnit库的API文档和jar包,对于Java开发者来说,是实现网页解析和爬虫功能的重要资源。 HTMLUnit的主要特点和功能包括: 1. **无头浏览器**:HTMLUnit可以在后台...
HTMLUnit是一款功能强大的Java库,它模拟了一个无头Web浏览器,允许开发者在没有真实浏览器环境的情况下执行JavaScript,处理Ajax请求,以及与网页进行交互。这个库对于自动化测试、数据抓取和网页爬虫项目非常有用...
通过这些技术手段,设计和实现一个能够定向爬取特定主题信息的网络爬虫。 总的来说,本课题旨在设计一个高性能、针对性强的网络爬虫,以满足特定信息的抓取需求,同时考虑到了技术实现、法律合规和市场需求等多个...
HTMLUnit和Jsoup是两种非常实用的工具,用于在Java编程环境下进行网络爬虫的开发。这个项目练习旨在帮助开发者掌握这两种技术,并通过实践提升网络爬取能力。 HTMLUnit是一个无头(headless)的Java浏览器,它模拟...
HtmlUnit是一个基于JAVA的爬虫工具,能够模拟浏览器的行为,从而实现自动化的爬虫操作。 在本案例中,我们首先需要引入HtmlUnit和Jsoup的依赖项,使用Maven配置进行依赖项的管理。HtmlUnit提供了一个WebClient类,...
1. **HTMLUnit简介**:HTMLUnit是一个模拟Web浏览器的Java库,它支持JavaScript、CSS、cookies和Ajax操作。通过使用HTMLUnit,开发者可以在没有真实浏览器的情况下执行网页交互,这对于自动化测试和性能评估非常有用...
标签中的"Java爬虫"表明这个库适用于Java开发者构建网络爬虫,"jar"指出了HTMLUnit是一个Java归档文件,可以直接在Java项目中使用。"selenium"虽然没有直接关联,但值得注意的是,Selenium WebDriver是一个更强大的...
开发者可以使用HtmlUnit来验证网页的动态行为,如表单提交、链接点击、AJAX请求等,而无需实际启动一个完整的浏览器。 在HtmlUnit 2.30中,我们可以预期以下关键特性: 1. **JavaScript支持**:HtmlUnit支持多种...