- 前言
今天想下载几张好看的壁纸,然后发现了一张是自己比较喜欢的额。然后点进去看看,WOW!好多好看的壁纸呀,于是我就起了贪念。哈哈!想把他们这一组图片打包下载,小白的方法就是一张一张下载,那样对于我们程序员来说是很low的办法。于是我考虑使用万能的java来下载他们的组图,花2小时鼓捣一下,但是觉得网上的文章大多是于抄袭,有些又不是很全。于是就了这篇文章,希望对各位有帮助。但不建议将此方法用作商业,因为盗用别人的图片属于违法行为!!! - 图片防盗链
很多网站为了防止别的网站盗用自己网站的图片,就是用了图片防盗链技术。也就是说,当我获取图片的url之后,直接在浏览器或者代码里访问。举个栗子:比如我想使用url要直接在浏览器中打开一张图片,但是出现的却是另外一张警告图片,里面写着:想查看图片请访问XXX网站。这就是一个典型的图片防盗链,其原理就是会在request的请求头里携带一个“referer”的变量,以此来判断该请求是从哪个链接跳转过来的。如果没有携带“referer”或者不是从本网站跳转一律返回警告或提示图片。 - 破解防盗链
知其原理,破其规律。既然咱们知道防盗链的原理,那我们可以很简单的伪装一个“referer”就可以了,也就是在请求之前先在request的header里添加一个变量为referer:http.xxx.xxxcom 也就是该网站的随意的一个url。package com.cmc.test; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; /** * 使用多线程下载防盗链图片 * * @author chenmc * @date 2017年8月30日 下午2:39:23 */ public class DownloadPicture { public static void main(String[] args) throws InterruptedException { for (int i = 1; i <= 10; i++) { int n = i; Thread t = new Thread(){ @Override public synchronized void run() { try { httpRequest(n); } catch (Exception e) { e.printStackTrace(); } super.run(); } }; t.start(); } } /** * 发起http请求 * * @author chenmc * @date 2017年8月30日 下午2:36:09 * @param n * @throws Exception */ public static void httpRequest(int n) throws Exception { for (int i = (n-1)*5 > 1 ? (n-1)*5 : 1; i < n*5; i++) { long startTime = System.currentTimeMillis(); String path = "C:/Users/admin/Pictures/壁纸/" + String.format("%03d", i) + ".jpg"; //这里url写你想要下载图片的url String uri = String.format("http://bizhi.xxx.com/rluo/%s.jpg", String.format("%03d", i)); System.out.println(uri); URL url = new URL(uri); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestProperty("referer", "http://bizhi.xxx.com"); //这是破解防盗链添加的参数 conn.setRequestMethod("GET"); conn.setConnectTimeout(5 * 1000); InputStream inStream = conn.getInputStream();//通过输入流获取图片数据 readInputStream(inStream, path);//得到图片的二进制数据,并保存 long endTime = System.currentTimeMillis(); System.out.println(path + "--耗时:" + (endTime-startTime)/1000 + "s"); } } /** * 保存图片 * * @author chenmc * @date 2017年8月30日 下午2:35:54 * @param inStream * @param path * @throws Exception */ public static void readInputStream(InputStream inStream, String path) throws Exception{ FileOutputStream fos = new FileOutputStream(new File(path)); byte[] buffer = new byte[102400]; int len = 0; while( (len=inStream.read(buffer)) != -1 ){ fos.write(buffer, 0, len); } inStream.close(); fos.flush(); fos.close(); } }
上述例子我使用了多线程技术,因为我想下载的壁纸有247张之多,所以我使用了50个线程,每个线程下载5张。因为是自己下载壁纸用的,所以没有考虑效率之类的,这里也希望大家可以自己去改进它。
最后给大家一波福利~~~好看的夕阳壁纸1 夕阳壁纸2 因为我上传的资源限制大小为80M,所以分开上传了~因为这是图片资源,所以csdn可能会删除哦,想要的同学们尽快下载吧! - 给大家养养眼~~~