基于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. 洛谷4172 WC2006水管局长(LCT维护最小生成树)

    这个题和魔法森林感觉有很相近的地方啊 同样也是维护一个类似最大边权最小的生成树 但是不同的是,这个题是有\(cut\)和询问,两种操作.... 这可如何是好啊? 我们不妨倒着来考虑,假设所有要\(cu ...

  2. 使用tinypng对需要上传Gitee图床的图片进行压缩

    目录 背景 Tinypng简介 Tinypng使用 手动上传图片 使用API 调用API自动上传超过1MB图片 安装tinyfy 自动上传脚本 其他 背景 在使用Gitee作为图床时(使用Typora ...

  3. redis中lua脚本的简单使用

    一.背景 在使用redis的过程中,发现有些时候需要原子性去操作redis命令,而redis的lua脚本正好可以实现这一功能.比如: 扣减库存操作.限流操作等等. redis的pipelining虽然 ...

  4. 热身训练1 Blood Cousins Return

    点此看题 简要题面: 一棵树上有n个节点,每个节点有对应的名字(名字可重复). 每次询问,求深度比$vi$多$ki$的$vi$的儿子中,有多少种名字 分析: Step1: 我们可以懂$DFS$轻松找到 ...

  5. 小白自制Linux开发板 九. 修改开机Logo

    许久不见啊,今天我们继续来修改我们的系统. 通过前面的几篇文章我们已经能轻松驾驭我们的开发板了,但是现在都是追求个性化的时代,我们在开发板上打上了自己的Logo,那我们是否可以改变开机启动的Logo呢 ...

  6. set prompt = "任意匹配字符" 当前目录详解

    转载:https://blog.csdn.net/alexdream/article/details/6865730 研究了两天的FreeBSD,总是感觉输入提示符那里怪怪的,而且默认的提示符还不带显 ...

  7. 访问单个结点的删除 牛客网 程序员面试金典 C++ Python

    访问单个结点的删除 牛客网 程序员面试金典 C++ Python 题目描述 实现一个算法,删除单向链表中间的某个结点,假定你只能访问该结点. 给定待删除的节点,请执行删除操作,若该节点为尾节点,返回f ...

  8. hdu 5175 Misaki's Kiss again(GCD和异或)

    题意: 给一个数N. 如果GCD(N,M) = N XOR M,则称M是一个kiss   1<=M<=N 问总共有多少个kiss.并且列出所有的值. 思路: 思路一:枚举M.有大量的GCD ...

  9. hdu 1058 Humble Numbers(构造?枚举?)

    题意: 一个数的质因子如果只是2,3,5,7中的若干个.则这个数叫做humble number. 例如:1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 1 ...

  10. 第07课 OpenGL 光照和键盘(1)

    光照和键盘控制: 在这一课里,我们将添加光照和键盘控制,它让程序看起来更美观. 这一课我会教您如何使用三种不同的纹理滤波方式.教您如何使用键盘来移动场景中的对象,还会教您在OpenGL场景中应用简单的 ...