`
jilong-liang
  • 浏览: 481399 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类

HtmlUnit实现ajax网络爬虫(转)

阅读更多
/**
 *网上关于网络爬虫实现方式有很多种,但是很多都不支持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!");
	}
}

 

分享到:
评论

相关推荐

    基于ApacheNutch和Htmlunit的扩展实现AJAX页面爬虫抓取解析插件nutch-htmlunit.zip

    protocol-htmlunit: 基于Htmlunit实现的AJAX页面Fetcher插件 parse-s2jh: 基于XPath解析页面元素内容; 基于数据库模式输出解析到结构化数据; 对于个别复杂类型AJAX页面定制判断页面加载完成的回调...

    基于Apache Nutch和Htmlunit的扩展实现AJAX页面爬虫抓取解析插件.zip

    【标题】"基于Apache Nutch和Htmlunit的扩展实现AJAX页面爬虫抓取解析插件.zip" 提供了一个深入的爬虫项目实例,旨在解决AJAX动态网页内容的抓取问题。Apache Nutch是一个开源的网络爬虫框架,而Htmlunit是一个无头...

    HtmlUnit 爬虫Demo

    这个"HtmlUnit爬虫Demo"可能是一个示例项目,展示了如何利用HtmlUnit库进行网络爬虫开发。以下是对HtmlUnit库及其在爬虫中的应用进行的详细说明。 **HtmlUnit简介** HtmlUnit是一个无头浏览器,意味着它没有图形...

    网络爬虫实现源码

    在这个“网络爬虫实现源码”中,我们主要关注的是利用Jsoup和HtmlUnit这两个Java库来构建爬虫引擎,以及如何从网站上获取图片地址信息。 Jsoup是一个流行的Java库,用于解析HTML文档。它的主要功能包括提取结构化...

    htmlunit爬虫技术

    在“htmlunit爬虫技术”中,我们将深入探讨如何利用HTMLUnit来实现高效的网络爬虫。 HTMLUnit的核心特性包括: 1. **JavaScript支持**:HTMLUnit能够执行JavaScript代码,这对于许多动态加载内容的现代网站来说至...

    htmlunit爬虫技术jar包

    HTMLUnit是一款功能强大的Java库,它模拟了一个无头Web浏览器,特别适用于自动化测试和网络爬虫。这个压缩包“htmlunit”很可能包含了HTMLUnit的核心库和其他相关依赖,使得开发者能够轻松地在Java项目中集成...

    com.gargoylesoftware.htmlunit-2.29所需包

    这个库在进行网络爬虫或自动化测试时非常有用,因为它可以解析HTML、执行JavaScript,甚至处理AJAX请求,而无需打开实际的浏览器。标题中的"com.gargoylesoftware.htmlunit-2.29所需包"表明这是HTMLUnit库的特定版本...

    htmlunit爬取动态页面jar包

    2. **HttpClient库**:HTMLUnit基于Apache HttpClient库进行HTTP通信,该库处理网络请求和响应,是实现网络爬虫的基础。 3. **Jsoup库**:可能包含Jsoup,这是一个解析和操作HTML的Java库,HTMLUnit可能使用它来...

    爬虫工具htmlunit,selemium,beatifulsoup

    标题中的“爬虫工具htmlunit,selenium,beautifulsoup”提到了三种在Web爬虫开发中常用的库。接下来,我们将详细探讨这三个工具的功能、用法以及它们在爬虫技术中的重要性。 1. **HtmlUnit**: HtmlUnit是一个...

    Htmlunit2.23-bin.zip

    7. 利用HTMLUnit的异步功能处理AJAX请求,等待页面完全加载。 HTMLUnit的一个显著优点是它的速度,因为不需要启动真正的浏览器实例,所以执行速度比使用Selenium等其他工具要快得多。然而,由于它是一种无头浏览器...

    htmlunit2.16+2.10两个

    网上关于网络爬虫实现方式有很多种,但是很多都不支持Ajax,李兄说:模拟才是王道。确实,如果能够模拟一个没有界面的浏览器,还有什么不能做到的呢? 关于解析Ajax网站的框架也有不少,我选择了HtmlUnit

    htmlunit-2.8(api文档).zip

    这个“htmlunit-2.8(api文档).zip”压缩包包含了HTMLUnit库的API文档和jar包,对于Java开发者来说,是实现网页解析和爬虫功能的重要资源。 HTMLUnit的主要特点和功能包括: 1. **无头浏览器**:HTMLUnit可以在后台...

    htmlunit依赖jar包

    HTMLUnit是一款功能强大的Java库,它模拟了一个无头Web浏览器,允许开发者在没有真实浏览器环境的情况下执行JavaScript,处理Ajax请求,以及与网页进行交互。这个库对于自动化测试、数据抓取和网页爬虫项目非常有用...

    定向网络爬虫开题报告.docx

    通过这些技术手段,设计和实现一个能够定向爬取特定主题信息的网络爬虫。 总的来说,本课题旨在设计一个高性能、针对性强的网络爬虫,以满足特定信息的抓取需求,同时考虑到了技术实现、法律合规和市场需求等多个...

    htmluinit+jsoup 网络爬虫 项目练习

    HTMLUnit和Jsoup是两种非常实用的工具,用于在Java编程环境下进行网络爬虫的开发。这个项目练习旨在帮助开发者掌握这两种技术,并通过实践提升网络爬取能力。 HTMLUnit是一个无头(headless)的Java浏览器,它模拟...

    JAVA使用HtmlUnit爬虫工具模拟登陆CSDN案例

    HtmlUnit是一个基于JAVA的爬虫工具,能够模拟浏览器的行为,从而实现自动化的爬虫操作。 在本案例中,我们首先需要引入HtmlUnit和Jsoup的依赖项,使用Maven配置进行依赖项的管理。HtmlUnit提供了一个WebClient类,...

    htmlunit-2.19-bin

    1. **HTMLUnit简介**:HTMLUnit是一个模拟Web浏览器的Java库,它支持JavaScript、CSS、cookies和Ajax操作。通过使用HTMLUnit,开发者可以在没有真实浏览器的情况下执行网页交互,这对于自动化测试和性能评估非常有用...

    htmlunit-2.30核心文件

    标签中的"Java爬虫"表明这个库适用于Java开发者构建网络爬虫,"jar"指出了HTMLUnit是一个Java归档文件,可以直接在Java项目中使用。"selenium"虽然没有直接关联,但值得注意的是,Selenium WebDriver是一个更强大的...

    HtmlUnit官网下载

    开发者可以使用HtmlUnit来验证网页的动态行为,如表单提交、链接点击、AJAX请求等,而无需实际启动一个完整的浏览器。 在HtmlUnit 2.30中,我们可以预期以下关键特性: 1. **JavaScript支持**:HtmlUnit支持多种...

Global site tag (gtag.js) - Google Analytics