Java 爬取网页图片并下载
源码;
package a;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;![在这里插入图片描述](https://img-blog.csdnimg.cn/20200711200336993.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0MDA5MzEx,size_16,color_FFFFFF,t_70#pic_center)
import org.jsoup.select.Elements;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
/**
* work:jre 1.8
*
* @author WEN轩
*
*/
public class img_sjtx {
/**
* 下载图片到指定目录
*
* @param filePath 文件路径
* @param imgUrl 图片URL
*/
// ***********************自定义变量
// 想要爬取的网址
static String url;
// 保存的位置
static String place;
// 文件链接所在标签
static String biao;
// 链接引入的方式//src url
static String path;
// 需要下载的文件的后缀数组
static String[] types;
// 将下载失败的文件记录下来
static Set<String> error = new HashSet<String>();
// 开始下载文件
public static void downImages(String filePath, String imgUrl) {
// 若指定文件夹没有,则先创建
File dir = new File(filePath);
String imgUrl_old = imgUrl;
if (!dir.exists()) {// 目录不存在就创建
dir.mkdirs();
}
// 截取图片文件名
String fileName = imgUrl.substring(imgUrl.lastIndexOf('/') + 1, imgUrl.length());
try {
// 文件名里面可能有中文或者空格,所以这里要进行处理。但空格又会被URLEncoder转义为加号
String urlTail = URLEncoder.encode(fileName, "UTF-8");
// 因此要将加号转化为UTF-8格式的%20
imgUrl = imgUrl.substring(0, imgUrl.lastIndexOf('/') + 1) + urlTail.replaceAll("\\+", "\\%20");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// 写出的路径
File file = new File(filePath + File.separator + fileName);
if (file.exists()) {// 对已经下载过的文件跳过,不需要可以将if语句去掉
System.out.println("已存在");
return;
}
try {
// 获取图片URL
URL url = new URL(imgUrl);
// 获得连接
URLConnection connection = url.openConnection();
// 设置10秒的相应时间
connection.setConnectTimeout(10 * 1000);
// 获得输入流
InputStream in = connection.getInputStream();
// 获得输出流
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file));
// 构建缓冲区
byte[] buf = new byte[1024];
int size;
// 写入到文件
while (-1 != (size = in.read(buf))) {
out.write(buf, 0, size);
}
out.close();
in.close();
System.out.println("下载完成");
} catch (MalformedURLException e) {
System.out.println("失败");
error.add(imgUrl_old);
// e.printStackTrace();
} catch (IOException e) {
System.out.println("失败");
// e.printStackTrace();
error.add(imgUrl_old);
} catch (Exception e) {
System.out.println("下载超时");
// e.printStackTrace();
}
}
// main
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("*********Java 爬虫下载网页文件 wx0725.top");
System.out.println("请依次输入下面属性的值:(回车确认)");
System.out.print("1.Website you want to crawl(网址链接): ");
setUrl(sc.nextLine());
System.out.println(getUrl());
System.out.print("2.Save in local location(绝对路径): ");
setPlace(sc.nextLine());
System.out.println(getPlace());
System.out.print("3.Label of file link(标签): ");
setBiao(sc.nextLine());
System.out.println(getBiao());
System.out.print("4.The way of link introduction[src/href]: ");
setPath(sc.nextLine());
System.out.println(getPath());
System.out.print("5.File extension(后缀数组,空格分隔): ");
setTypes(sc.nextLine().split(" "));
System.out.println(getTypes());
// 利用Jsoup获得连接
Connection connect = Jsoup.connect(url);
Map<String, Boolean> v = new HashMap<String, Boolean>();// 存储需要下载的类型
for (String ch : types) {
v.put(ch, true);
}
// 执行体
try {
System.out.println("请耐心等待......");
// 得到Document对象
Document document = connect.get();
System.out.println("连接成功!!!");
// 查找所有img标签
Elements imgs = document.getElementsByTag(biao);
System.out.println("开始下载");
// 遍历img标签并获得src的属性
for (Element element : imgs) {
// 获取每个img标签URL "abs:"表示绝对路径
String imgSrc = element.attr("abs:" + path);
String type = imgSrc.substring(imgSrc.lastIndexOf(".") + 1).trim();// 获取链接的后缀类型
if (v.containsKey(type)) {
// 打印URL
System.out.println("正在下载" + "来自" + imgSrc.substring(0, imgSrc.lastIndexOf("/") + 1) + "的"
+ imgSrc.substring(imgSrc.lastIndexOf("/") + 1));
// 下载图片到本地
img_sjtx.downImages(place, imgSrc);
}
}
System.out.println("网页爬取完成");
if (!error.isEmpty()) {// 判断是否有失败的文件
System.out.println("下面是下载失败的文件,建议您手动下载。(小弟不才)");
Iterator<String> it = error.iterator();
it.forEachRemaining(obj -> System.out.println(obj));
} else {
System.out.println("********恭喜没有下载失败的文件*******");
}
} catch (IOException e) {
System.out.println("由于您的操作异于常人导致下载途中出现异常。(请重试)");
// e.printStackTrace();
System.out.println("r读取时间超时");
}
sc.close();
}
public static String getUrl() {
return url;
}
public static void setUrl(String url) {
img_sjtx.url = url;
}
public static String getPlace() {
return place;
}
public static void setPlace(String place) {
img_sjtx.place = place;
}
public static String getBiao() {
return biao;
}
public static void setBiao(String biao) {
img_sjtx.biao = biao;
}
public static String getPath() {
return path;
}
public static void setPath(String path) {
img_sjtx.path = path;
}
public static String[] getTypes() {
return types;
}
public static void setTypes(String[] types) {
img_sjtx.types = types;
}
public static Set<String> getError() {
return error;
}
public static void setError(Set<String> error) {
img_sjtx.error = error;
}
}
先看下目标:
运行效果:
依赖包:jsoup-1.12.1.jar 已经个人传到QQ群
加群,建议下载后退群
或者百度直接就可以搜到
这篇关联公众号文章:《获取随机头像》
演示地址:进入公众号,后台回复关键字(见获取随机头像文章),点击进入链接,点击最下方超链接即可