JAVA爬虫—htmlunit

HtmlUnit是一个无界面浏览器Java程序,可以很便捷的操作网页,就是我们常说的爬虫。它为HTML文档建模,提供了调用页面、填写表单、单击链接等操作的API。就跟你在浏览器里做的操作一样。

Httpclient+jsoup也是能够爬取一些我们常需要的数据,但是还是有一些缺陷,比如有些页面数据是js加载出来的 httpclient解析不出来,比如百度云用户页面,淘宝页面,连开源中国博客的博客内容都是Js加载或者处理的,所以httpClient是解析不出来的,这里htmlunit就是一个很好的方案,内嵌js浏览器,模拟Js运行,把结果执行出来。

下面是我爬取的疫情数据,包括了一些获取常规元素的方法

package com.xmy.cn;

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlListItem;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

public class test 
{

	public static void main(String[] args) throws InterruptedException
	{
		WebClient webClient = new WebClient(BrowserVersion.CHROME);
		
		//取消js css支持
		webClient.getOptions().setJavaScriptEnabled(false);
		webClient.getOptions().setCssEnabled(false);
		
		HtmlPage page;
		try {
			//获取需要解析的页面
			page = webClient.getPage("https://m.medsci.cn/wh.do");
			Thread.sleep(1000); // 休息10秒钟
			//获取页面全部文本
//			System.out.println(page.asText());
			
			//====根据tag名称  查询所需数据===//
			//HTML中tag是由尖括号包围的关键词,比如 <html>
			DomNodeList<DomElement> aList = page.getElementsByTagName("p"); 
//            for(int i=0;i<aList.getLength();i++)
//            {
//                DomElement a=aList.get(i);
//                System.out.println(a.asText());
//            }
			
			//标题  
			DomElement a = aList.get(0);
			System.out.println(a.asText());
			
			//===xpath方式查询所需数据===//
			
			//确诊人数
			HtmlListItem item1 = (HtmlListItem) page.getByXPath("//ul['count_list']/li").get(0);
			//疑似人数
			HtmlListItem item2 = (HtmlListItem) page.getByXPath("//ul['count_list']/li").get(1);
			//死亡人数
			HtmlListItem item3 = (HtmlListItem) page.getByXPath("//ul['count_list']/li").get(3);
			//治愈人数
			HtmlListItem item4 = (HtmlListItem) page.getByXPath("//ul['count_list']/li").get(4);
			
			System.out.println("确诊人数: "+item1.asText());
			System.out.println("疑似人数: "+item2.asText());
			System.out.println("死亡人数: "+item3.asText());
			System.out.println("治愈人数: "+item4.asText());
			
			
		} catch (FailingHttpStatusCodeException e) {
			
			e.printStackTrace();
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//释放资源
			webClient.closeAllWindows();
		}
		

	}

}

输出结果:

截至 2020-2-5 21:37:27 数据统计
确诊人数: 24511确诊
疑似人数: 15625疑似
死亡人数: 490死亡
治愈人数: 901治愈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值