基于java 必应壁纸批量下载 - rookie丶k - 博客园 (cnblogs.com)实现

上面代码运行本地有点小问题,改了改

1.ssl验证

2.请求头

3.需要优化下载速度,多线程方式(还不会)

/* *
*@Description:
*@Author:TYJ
*@Date: create in 2020/4/22 18:18
*/ import javax.net.ssl.*;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
public class SslUtils {
private static void trustAllHttpsCertificates() throws Exception {
TrustManager[] trustAllCerts = new TrustManager[1];
TrustManager tm = new miTM();
trustAllCerts[0] = tm;
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
static class miTM implements TrustManager,X509TrustManager {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public boolean isServerTrusted(X509Certificate[] certs) {
return true;
}
public boolean isClientTrusted(X509Certificate[] certs) {
return true;
}
public void checkServerTrusted(X509Certificate[] certs, String authType)
throws CertificateException {
return;
}
public void checkClientTrusted(X509Certificate[] certs, String authType)
throws CertificateException {
return;
}
}
/**
* 忽略HTTPS请求的SSL证书,必须在openConnection之前调用
* @throws Exception
*/
public static void ignoreSsl() throws Exception{
HostnameVerifier hv = new HostnameVerifier() {//实现自己的脚丫逻辑,这里就直接返回true,不进行校验
public boolean verify(String urlHostName, SSLSession session) {
System.out.println("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost());
return true;
}
};
trustAllHttpsCertificates();
HttpsURLConnection.setDefaultHostnameVerifier(hv);
}
}

  

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document; import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class WallpaperDownload {
private static final String BY_PREFIX = "https://bing.ioliu.cn"; public static void main(String[] args) {
// 运行时指定一个本地下载路径
String path = "";
for(int i=0; i<args.length; i++){
path = args[i]; }
if(path == null || path.length()==0){
path = "C:\\Users\\HP\\Pictures\\bing";
}
File filePath = new File(path);
if(!filePath.exists()){
System.out.println("创建目录:" + filePath.getName());
filePath.mkdirs();
}
System.out.println("下载位置:" + filePath.getName());
download(path); } public static void download(String path) {
long start = System.currentTimeMillis();
String pageHtml = "https://bing.ioliu.cn/ranking";
for (int i = 1; i <= 105; i++) {
if (i > 1) {
pageHtml = pageHtml + "?p=" + i; }
try {
String[] links = getAddress(pageHtml);
execute(links, path);
} catch (IOException e) {
e.printStackTrace();
}
pageHtml = "https://bing.ioliu.cn/ranking"; }
long end = System.currentTimeMillis();
long time = (end - start) / 1000;
System.out.println("下载耗时:" + time);
} /**
* 下载图片
*
* @param links
* @param path 下载位置
* @throws
*/
public static void execute(String[] links, String path) throws IOException {
if (!path.endsWith("\\")) {
path = path + "\\";
}
for (int i = 0; i < links.length; i++) {
HttpURLConnection urlConnection = getConnection(links[i]);
InputStream ins = urlConnection.getInputStream();
String imageName = links[i].substring(links[i].lastIndexOf("/") + 1).split("\\?")[0];
File file = new File(path + imageName + ".jpg");
OutputStream outputStream = null;
if (!file.exists()) {
outputStream = new FileOutputStream(file);
int readCount;
byte[] bytes = new byte[10240];
while ((readCount = ins.read(bytes)) != -1) {
outputStream.write(bytes, 0, readCount);
}
System.out.println("[" + imageName + "] download finished ...");
} else {
System.out.println(file.getName() + " existed ...");
}
} } /**
* 获取下载链接地址
*
* @return
* @throws IOException
*/
public static String[] getAddress(String htmlPage) throws IOException {
System.out.println("get [" + htmlPage + "] info ...");
HttpURLConnection connection = getConnection(htmlPage);
InputStream is = connection.getInputStream();
String newLine = System.getProperty("line.separator");
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
StringBuilder result = new StringBuilder();
String line;
String html;
while ((line = reader.readLine()) != null) {
result.append(line + newLine);
}
html = result.toString();
Document doc = Jsoup.parseBodyFragment(html);
html = doc.body().html();
String[] links = extractLinks(html);
return links;
} /**
* 提取图片链接
*
* @param html
*/
static String[] extractLinks(String html) {
List<String> list = new ArrayList<>(); String pattern = "/photo/.*_.*\\?force=download";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(html); while (m.find()) {
String group = m.group();
String[] split = group.split("&");
list.add(split[0]+"?force=download");
}
String[] results = new String[list.size()];
for (int i = 0; i < list.size(); i++) {
results[i] = BY_PREFIX + list.get(i);
}
return results; } /**
* 获取连接
*
* @param urlStr
* @return
*/
public static HttpURLConnection getConnection(String urlStr) {
HttpURLConnection urlConnection = null;
try {
URI uri = new URI(urlStr);
URL url = uri.toURL(); try {
//自己伪造ssl证书
SslUtils.ignoreSsl();
} catch (Exception e) {
e.printStackTrace();
} urlConnection = (HttpURLConnection) url.openConnection();
//防止403
//Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.55
urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.55"); } catch (URISyntaxException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} return urlConnection;
}
}

  

java 必应壁纸批量下载的更多相关文章

  1. Java实现批量下载《神秘的程序员》漫画

    上周看了西乔的博客“西乔的九卦”.<神秘的程序员们>系列漫画感觉很喜欢,很搞笑.这些漫画经常出现在CSDN“程序员”杂志末页的,以前也看过一些. 后来就想下载下来,但是一张一张的点击右键“ ...

  2. JAVA SFTP文件上传、下载及批量下载

    JavaJsch  1.jsch官方API查看地址(附件为需要的jar) http://www.jcraft.com/jsch/ 2.jsch简介 JSch(Java Secure Channel)是 ...

  3. java批量下载,将多文件打包成zip格式下载

    现在的需求的: 根据产品族.产品类型,下载该产品族.产品类型下面的pic包: pic包是zip压缩文件: t_product表: 这些包以blob形式存在另一张表中: t_imagefile表: 现在 ...

  4. java/resteasy批量下载存储在阿里云OSS上的文件,并打包压缩

    现在需要从oss上面批量下载文件并压缩打包,搜了很多相关博客,均是缺胳膊少腿,要么是和官网说法不一,要么就压缩包工具类不给出 官方API https://help.aliyun.com/documen ...

  5. Java实现的有道云笔记图片批量下载工具

    有朋友问我每天哪里找时间写这么多文章. 作为一个程序员,当然要善于利用各种工具提高自己做事情的效率了.如果没有现成的工具,就得自己造. 我写文章一般是在云笔记里编辑,完成之后直接复制粘贴到自媒体平台. ...

  6. java上传附件,批量下载附件(一)

    上传附件代码:借助commons-fileupload-1.2.jar package com.str; import java.io.BufferedInputStream;import java. ...

  7. Java批量下载文件并zip打包

    客户需求:列表勾选需要的信息,点击批量下载文件的功能.这里分享下我们系统的解决方案:先生成要下载的文件,然后将其进行压缩,生成zip压缩文件,然后使用浏览器的下载功能即可完成批量下载的需求.以下是zi ...

  8. java+文件批量下载

    这篇文章主要介绍了Java实现批量下载选中文件功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下 1.在action中定义变量 private List<String> downLoa ...

  9. java批量下载

    最近做了一些有关批量压缩下载的功能,网上也找了一些资源,但都不是太全面,所以自己整理一份,已备不时之需. 直接上代码: // 获取项目路径     private static String WEBC ...

随机推荐

  1. linux kill信号详解

    大家对kill -9 肯定非常熟悉,在工作中也经常用到.特别是你去重启tomcat时.可是多半看来,我们对-9的理解只是表面而已. 很少有人(包括我)认真的去了解一下 kill -n 这个n到底是什么 ...

  2. pymysql基础

    一,基本使用 倒入模块 import pymysql conn=pymysql.connect( host="数据库地址,本机是localhost,别的机器是ip", user=& ...

  3. docsify + Gitee Pages服务搭建开源项目网站

    前言 base-admin从开源至今,已经收获了2k Stat,而我们一直都没有一份像样的在线文档,最近写了一个博客园随笔备份Java脚本,将博客随笔备份到本地,格式是md文档格式,就有意去找将md文 ...

  4. python和shell 取日期为今天的行

    按条件取行 todolist.txt是存储所有数据的地方,每次查看数据库显得麻烦. 在执行命令后,要在终端显示今日应作事项. 首先用linux 的shell脚本来实现该功能. grep指令可以在文件中 ...

  5. 力扣 - 剑指 Offer 39. 数组中出现次数超过一半的数字

    题目 剑指 Offer 39. 数组中出现次数超过一半的数字 思路1(排序) 因为题目说一定会存在超过数组长度一半的一个数字,所以我们将数组排序后,位于length/2位置的一定是众数 代码 clas ...

  6. JavaScript03

    类型转换和运算符 typeof函数 检测数据类型,可以使用以下两种调用的方式: typeof 变量或表达式 typeof(变量或表达式) var n="asda"; console ...

  7. 第五次Scrum Metting

    日期:2021年5月2日 会议主要内容概述:讨论前端进度,修改后端接口. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇龙 后端 模板模块的实现及批量插入更 ...

  8. Spring 5 中函数式web开发中的swagger文档

    Spring 5 中一个非常重要的更新就是增加了响应式web开发WebFlux,并且推荐使用函数式风格(RouterFunction和 HandlerFunction)来开发WebFlux.对于之前主 ...

  9. 2021.8.8考试总结[NOIP模拟33]

    T1 Hunter 考场上一看期望直接状压拿了$45pts$跑了.结果正解只用$4$行? 把问题转化为一号猎人之前死的猎人数的期望加一. 期望的线性性. 对每个猎人$i$,$w_i+w_1$种情况中有 ...

  10. WiFi天线对PCB布局布线和结构的要求详解 - 全文

    随着市场竞争的加剧,硬件设备正以集成化的方向发展.天线也由外置进化内置再进化到嵌入式,我们先来介绍这类应用的天线种类: ⑴ On Board板载式:采用PCB蚀刻一体成型,性能受限,极低成本,应用于蓝 ...