基于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. 题解 2020.10.24 考试 T4 模板

    题目传送门 题目大意 有一个 \(n\) 个点组成的树,有 \(m\) 次操作,每次将 \(1\to x\) 的路径上每个点都加入一个颜色为 \(c\) 的小球.但是每个点都有大小限制,即小球个数超过 ...

  2. 试题 算法训练 二进制数数 java解题

    资源限制 时间限制:1.0s   内存限制:256.0MB 问题描述 给定L,R.统计[L,R]区间内的所有数在二进制下包含的"1"的个数之和. 如5的二进制为101,包含2个&q ...

  3. Linux中使用dd制作文件的.img

    dd if=/dev/zero of=new_img.img bs=1M count=20   //生成20M的文件,bs块的大小,count块的数量 mkfs.ext3 new_img.img  / ...

  4. javascript-原生-闭包

    1.变量的作用域 前提:这里只全部都通过var创建的变量或对象 1.全局变量:函数外创建变量 var x=10; function test(){ alert("全局变量在test函数中&q ...

  5. ScatterLayout:分散布局在py中的引用

    """ ScatterLayout:分散布局 """ from kivy.app import App from kivy.uix.scat ...

  6. Manjaro安装Mariadb

    Mariadb是MySQL的一个复刻.由于MySQL被Oracle公司收购,MySQL的一些原始开发者担心MySQL会有开源方面的某些隐患,故领导开发了Mariadb. 如今,Mariadb已经作为许 ...

  7. JVM:Hotspot虚拟机中的对象

    在HotSpot虚拟机中,对象在内存中存储的布局可以被分为3个区域:对象头(Header).实例数据(Instance data)和对齐填充(Padding).对象头包括两部分信息,第一部分存储自身的 ...

  8. Shadertoy 教程 Part 3 - 矩形和旋转

    Note: This series blog was translated from Nathan Vaughn's Shaders Language Tutorial and has been au ...

  9. $time $stime $realtime

    1,$time The $time system function returns an integer that is a 64-bit time, scaled to the timescale ...

  10. fd定时器--timerfd学习

    定时器 可以用系统定时器信号SIGALARM 最近工作需要于是又发现了一个新玩意timerfd配合epoll使用. man 手册看一下 TIMERFD_CREATE(2) Linux Programm ...