htmlunit使用教程爬取网站的数据并保存成Excel表格

htmlunit是一款java的项目,它是开源的,它是一个没有界面的浏览器可以模拟浏览器的任何行为,比如点击事件,页码跳转,复杂的ajax加载的数据等,如果想使用java进行爬虫,HTMLunit绝对是你的不二之选,下面我会介绍如何使用HTMLunit来爬取一个网站的数据。HTMLunit官网,官网上有帮助文档,都是英文的。

建议:在爬取网站的数据时,最好知道一个网页的结构布局才方便你解析一个网站,爬取数据。

一、首先我们要去官网下载htmlunit,http://htmlunit.sourceforge.net/。

二、用eclipse或者myeclipse新建一个项目,新建一个lib文件夹,将需要的jar放入lib中,并在项目中配置引用lib。

三、

//新建一个浏览器对象,设置模拟使用CHROME浏览器的内核
WebClient webClient = new WebClient(BrowserVersion.CHROME)
//设置webClient的相关参数
//设置是否加载脚本
webClient.getOptions().setJavaScriptEnabled(true);
//设置是否在css样式,建议设置为false可以提高爬取的速度
webClient.getOptions().setCssEnabled(false);
//设置ajax的相关参数
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
//设置需要抓取那个网站的数据
String url = "http://www.cninfo.com.cn/search/search.jsp";
//获取该网站的数据并保存在htmlPage中
HtmlPage htmlPage= webClient.getPage(url);
//该方法在getPage()方法之后调用才能生效
webClient.waitForBackgroundJavaScript(1000*3);
webClient.setJavaScriptTimeout(0);
//选中创业板的select
if(page == 1){
	//设置时间
	//获取name为startTime的input标签,获取标签的方法有三种ID,Name,class
	HtmlInput starttime = htmlPage.getElementByName("startTime");
	//设置input标签的值为
	starttime.setValueAttribute("2016-12-21");
	HtmlInput endtime = htmlPage.getElementByName("endTime");
	endtime.setValueAttribute("2016-12-21");
	//获取ID为marketType的标签
	DomElement select = htmlPage.getElementById("marketType");
	//获取所有的option标签
	DomNodeList listSelect = select.getElementsByTagName("option");
	for(int i = 0;i <  listSelect.size();i++){
		//设置选中哪一个select中的option
		if(i==3){
			HtmlOption htmlOption = (HtmlOption) listSelect.get(i);
			htmlOption.setSelected(true);
		}
	}
	//根据ID得到form表单
	HtmlForm form = htmlPage.getFormByName("queryHistoryForm");
	//点击查询按钮
	HtmlButtonInput button = form.getInputByValue("查询");
	//提交form表单,并将获取到的数据重新赋值给htmlPage
	htmlPage = button.click();
}
//解析获取的数据,可以通过一层一层的解析来获取数据,也可以获取整个的网页数据,然后通过正则表达式来解析网页提取需要的数据
//获取所有为table标签
DomNodeList list = htmlPage.getElementsByTagName("table");
//获取第二个table标签
DomElement element = (DomElement) list.get(1);
//获取table标签中的tr标签
DomNodeList elementTr = element.getElementsByTagName("tr");
String code = "";
String title = "";
String titleHref = "";
String timedata = "";
//遍历table标签中的tr标签
for(int i = 0;i<elementTr.size();i++){
	DomElement elementTd = (DomElement) elementTr.get(i);
	DomNodeList listTd = elementTd.getElementsByTagName("td");
	for(int j = 0;j<listTd.size();j++){
		DomElement domElement = (DomElement) listTd.get(j);
			if(j==0){
					code = domElement.asText();
			}else if(j==1){
					title = domElement.asText();
					titleHref = "http://www.cninfo.com.cn" + elementTd.getElementsByTagName("a").get(0).getAttribute("href");						
			}else if(j == 2){
					timedata = domElement.asText();
			}
			//计算有多少页,下一页
			DomNodeList listSpan = htmlPage.getElementsByTagName("span");
			DomElement elementSpan = (DomElement) listSpan.get(4);
			DomNodeList lista = elementSpan.getElementsByTagName("a");
			if(page == 1){
				HtmlAnchor asum;
				if(lista.size()>0){
					asum = (HtmlAnchor) lista.get(lista.size()-1);
					sumPage = Integer.parseInt(asum.asText());
				}else{
					sumPage = 1;
				}
				//得到总共的页数
				
			}
			if(page == sumPage){
				try {
					book.write();
					book.close();
				} catch (WriteException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}			
			if(page < sumPage){
				for(int i = 0;i<=sumPage-2;i++){
					HtmlAnchor a = (HtmlAnchor) lista.get(i);
					String pageStr = a.asText();
					if(page+1 == Integer.parseInt(pageStr)){
						htmlPage.cleanUp();
						htmlPage = a.click();
						page++;
						obtaindataBypage(file,book,sheet);
					}
				}
			}
			//关闭浏览器对象
			webClient.close();



 总结:我们可以通过获取a标签,然后再获取点击a标签之后的页面,代表如下: 

HtmlAnchor  anchor =  (HtmlAnchor) item.getChildNodes().get(0);
HtmlPage   htmlPage = anchor.click();

获取点击之后的页面数据之后,最好使用Thread.slepp(3000)使当前线程休眠一段时间,保证数据能够被加载出来。

下面是整个项目的地址:http://download.csdn.net/detail/sinat_29957455/9892512


HTMLUnit是一个Java库,它用于模拟浏览器行为并执行Web页面的自动化测试。下面是一个简单的HTMLUnit使用教程: 1. 首先,你需要在你的Java项目中导入HTMLUnit库。你可以通过在你的构建工具(如Maven或Gradle)中添加以下依赖来实现: ```xml <dependency> <groupId>net.sourceforge.htmlunit</groupId> <artifactId>htmlunit</artifactId> <version>2.53.0</version> </dependency> ``` 2. 创建一个新的Java类,并导入HTMLUnit相关的类和方法: ```java import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlPage; ``` 3. 在你的代码中创建一个WebClient对象,并启用JavaScript支持(如果需要执行JavaScript): ```java WebClient webClient = new WebClient(); webClient.getOptions().setJavaScriptEnabled(true); ``` 4. 使用WebClient对象获取HtmlPage对象,该对象表示要测试的Web页面: ```java HtmlPage page = webClient.getPage("http://example.com"); ``` 5. 一旦你有了HtmlPage对象,你就可以通过使用HTML DOM模型中的方法来获取页面的元素或执行其他操作。例如,你可以通过元素的ID获取元素: ```java HtmlElement element = page.getElementById("myElementId"); ``` 6. 你还可以模拟用户与页面的交互,例如填写表单、点击按钮等。例如,要填写一个文本框,你可以使用以下代码: ```java HtmlTextInput textField = (HtmlTextInput) page.getElementById("myTextFieldId"); textField.setValueAttribute("Hello, HTMLUnit!"); ``` 7. 最后,记得在使用完毕后关闭WebClient对象,以释放资源: ```java webClient.close(); ``` 这只是一个HTMLUnit的简单使用教程,你可以根据你的具体需求进一步深入学习和了解HTMLUnit的功能和特性。希望对你有帮助!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修炼之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值