HtmlUnit 爬取网站壁纸资源

当你想一些资源又无从找时,那么就可以在别人网中爬取。OωO

HtmlUnit 官方简介:

HtmlUnit 是“Java 程序的无 GUI 浏览器”。它对 HTML 文档进行建模并提供一个 API,允许您调用页面、填写表单、单击链接等……就像您在“普通”浏览器中所做的一样。

它具有相当好的 JavaScript 支持(不断改进),甚至能够使用相当复杂的 AJAX 库,根据使用的配置模拟 Chrome、Firefox 或 Internet Explorer。

它通常用于测试目的或从网站检索信息。

总之 htmlunit可以模拟浏览器执行,不会正真打开一个浏览器界面,是webdriver的轻量级实现。 可用于获取网站信息。

相比其他java中支持爬虫的框架(WebMagic、Spider、Jsoup),HtmlUnit运行速度快,操作元素API丰富。官方API文档

爬取乌云高清壁纸站 风景壁纸类壁纸

1.创建WebClient浏览器:

1
2
3
//无参构造创建 默认使用谷歌浏览器
WebClient webClient = new WebClient();

public WebClient() {
this(BrowserVersion.getDefault());
}

/** Latest Chrome. */
public static final BrowserVersion CHROME = new BrowserVersion(103, “Chrome”);

2.浏览器设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 		//设置支持AJAX
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
////开启页面重定向
webClient.getOptions().setRedirectEnabled(true);
//关闭ssl安全访问
webClient.getOptions().setUseInsecureSSL(false);
//关闭异常抛出
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
//忽略解析 css js false
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(false);
//设置是否允许本机 ActiveX。默认值为假。请注意,除非您完全信任 JavaScript 代码,否则绝不应该允许运行本机 ActiveX 组件,因为它不受 Java 虚拟机控制
webClient.getOptions().setActiveXNative(false);
  1. 获取HtmlPage信息
1
2
//String baseUrl = "https://www.obzhi.com/category/fengjingbizhi";  
page = webClient.getPage(baseUrl);

4.从浏览器网站页面F12 获取图像元素定位,获取HtmlImage集合对象

以下使用xpath 语法获取,具体可参考xpath语法

1
List<HtmlImage> l=  page.getByXPath("//div[@class='thumbnail']/a/img");

5.遍历截取图片路径信息及下载本地

1
2
3
4
5
6
7
8
9
for (HtmlImage image : l) {
String sub = StringUtils.substringAfterLast(image.getSrcAttribute(), "src=");
String douwnUrl = StringUtils.substringBefore(sub, "&").replace("http:", "https:");
System.out.println(douwnUrl);
try {
HttpUtil.download(douwnUrl, new FileOutputStream("D://obzhi//" +StringUtils.substringAfterLast(douwnUrl,"/")), true);
} catch (Exception e) {
System.out.println("图片不存在");
}

打印获取url路径示例:

https://www.obzhi.com/wp-content/uploads/2016/09/yujia.jpg
https://www.obzhi.com/wp-content/uploads/2016/09/huanghun.jpg
https://www.obzhi.com/wp-content/uploads/2016/09/dahaichonglang.jpg
https://www.obzhi.com/wp-content/uploads/2016/09/haibianbieshu.jpg
https://www.obzhi.com/wp-content/uploads/2016/09/senlindahai.jpg

……

注:部分url 地址需 https:才能访问 所以这里全替换成https:了

6.完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
WebClient webClient = new WebClient();
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.getOptions().setRedirectEnabled(true);
webClient.getOptions().setUseInsecureSSL(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setActiveXNative(false);
//obzhi
String baseUrl = "https://www.obzhi.com/category/fengjingbizhi";
HtmlPage page;
//尾页数
int endPage =2;
for (int i = 1; i < endPage; i++) {
baseUrl= i>1 ? baseUrl.concat("//page/") + i : baseUrl;
page = webClient.getPage(baseUrl);
List<HtmlImage> l= page.getByXPath("//div[@class='thumbnail']/a/img");
for (HtmlImage image : l) {
String sub = StringUtils.substringAfterLast(image.getSrcAttribute(), "src=");
String douwnUrl = StringUtils.substringBefore(sub, "&").replace("http:", "https:");
System.out.println(douwnUrl);
try {
HttpUtil.download(douwnUrl, new FileOutputStream("D://obzhi//" +StringUtils.substringAfterLast(douwnUrl,"/")), true);
} catch (Exception e) {
System.out.println("图片不存在");
}
}