概述
- 一、前言
- 二、java代码
一、前言
- 这里有一篇 Go 写的 go下载汉服图片
- 还有一篇 php写的 PHP下载汉服图片,本篇用 java 来实现。
- 没用任何框架,只用PHP原生函数 + 自定义方法
- 通过:
Pattern 相关方法
匹配标签里的元素实现 - 复制即用
如果匹配元素有所变动,可按最新结果调整一下
二、java代码
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class HanFu {
private static int startPage = 1; //开始页
// private int endPage = 125; //结束页
private static int endPage = 3; //结束页 这里只处理3页
private static String rootUrl = "https://www.aihanfu.com/zixun/tushang-";
public static void main(String[] args) {
everyPage(startPage, endPage);
}
public static void everyPage(int startPage, int endPage) {
for (int page = startPage; page <= endPage; page++) {
System.out.printf("处理第 [%d] 页的数据;n", page);
String pageUrl = rootUrl + page;
// System.out.println(pageUrl + "n");
String html = getUrlHtml(pageUrl);
// System.out.println(html);
//<h3 class="yh"><a target="_blank" href="http://www.aihanfu.com/wen/8332/">【汉服美景】天地之间,你是另一种绝色</a></h3>
String pattern = "<h3 class="yh"><a target="_blank" href="(.*?)">([^<]+)</a>";
// Pattern patternCompile = Pattern.compile(pattern); //, Pattern.MULTILINE
Pattern patternCompile = Pattern.compile(pattern); //, Pattern.MULTILINE
Matcher matcher = patternCompile.matcher(html);
// System.out.println(matcher.matches());//字符串中是否包含了
// System.out.println(matcher.find());//字符串中是否找到数字串
if (!matcher.find()) {
System.out.printf("第 [%d] 页未匹配到数据,执行下一页n", page);
continue;
}
while (matcher.find()) {
//方法一:打印匹配到的整个表达式
// System.out.println(matcher.group());
//方法二:打印匹配到的整个表达式
// System.out.println(matcher.group(0));
//打印匹配到的结果内容
// System.out.println(matcher.group(1));
// System.out.println(matcher.group(2));
String detailUrl = matcher.group(1); //每篇文章的地址
String detailTitle = matcher.group(2); //每篇文章的标题
evertArticle(detailUrl, detailTitle);
//记录日志
logger(detailTitle + "-" + detailUrl + "n");
}
/*if (matcher.find()) { //查找匹配到的第一条数据
System.out.println(matcher.group(0) + "n");
System.out.println(matcher.group(1) + "n");
System.out.println(matcher.group(2) + "n");
} else {
System.out.println("没有匹配到数据");
}*/
// System.out.print(matcher.groupCount()); //表达式有多少个分组(结果集),(不包含特殊的组(group(0))它总是代表整个表达式。该组不包括在 groupCount 的返回值中。)
}
}
//处理每一篇文章
public static Boolean evertArticle(String detailUrl, String detailTitle) {
String html = getUrlHtml(detailUrl);
//详情页一张图片的Html内容如下,我们可以写匹配的语句了
//<figure class="image"><img src="https://static.aihanfu.net/uploadfile/2022/1007/20221007094025127.jpeg"></figure>
String pattern = "<figure class="image"><img src="(.*?)"></figure>";
Pattern patternCompile = Pattern.compile(pattern);
Matcher matcher = patternCompile.matcher(html);
// System.out.println(matcher.find());
// System.exit(1);
String dir = createDir(detailTitle); //根据标题名创建文件夹
while (matcher.find()) {
//方法一:打印匹配到的整个表达式
// System.out.println(matcher.group());
//方法二:打印匹配到的整个表达式
// System.out.println(matcher.group(0));
//打印匹配到的结果内容
// System.out.println(matcher.group(1)); //图片的地址
String imageUrl = matcher.group(1); //图片的地址
// System.out.println(imageUrl);
int lastEqIndex = imageUrl.lastIndexOf("/"); //匹配最右边的/位置
String fileName = imageUrl.substring(lastEqIndex); //带/的原始文件名
String savePath = dir + fileName; //图片保存路径
//图片下载
try {
downLoadFile(imageUrl, savePath);
} catch (IOException e) {
e.printStackTrace();
}
System.out.printf("---- 图片 [ %s ] 下载 [ %s ] 成功n", imageUrl, savePath);
}
return true;
}
//获取url的html内容
public static String getUrlHtml(String pageUrl) {
String html = "";
try {
URL url = new URL(pageUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置超时时间为3秒
conn.setConnectTimeout(3 * 1000);
//防止屏蔽程序抓取而返回403错误
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
conn.setRequestMethod("GET");
Scanner scanner = new Scanner(conn.getInputStream());
while (scanner.hasNextLine()) {
html += scanner.nextLine();
}
} catch (Exception e) {
e.printStackTrace();
}
return html;
}
//写日志
public static void logger(String content) {
String dir = "logger/";
//创建文件夹
createDirectory(dir);
String fileName = getTodayDate() + ".txt";
try {
BufferedWriter out = new BufferedWriter(new FileWriter(fileName, true)); //true,文件内容支持追加
out.write(content);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//根据标题创建文件夹
public static String createDir(String title) {
//日期格式化
String dateStr = getTodayDate();
//目录拼接
String dir = "image/" + dateStr + "/" + title;
//创建文件夹
createDirectory(dir);
return dir;
}
//尝试递归创建文件夹
public static void createDirectory(String filePath) {
File file = new File(filePath);
if (!file.exists() || !file.isDirectory()) { //文件不存在 或 不是文件夹
boolean result = file.mkdirs();
if (!result) {
die("文件夹创建失败");
}
}
}
//获取今天的日期
public static String getTodayDate() {
LocalDate date = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); //年-月-日
String dateStr = date.format(formatter);
return dateStr;
}
//下载文件
public static void downLoadFile(String imageUrl, String savePath) throws IOException {
URL url = new URL(imageUrl);
BufferedInputStream bufferedInputStream = new BufferedInputStream(url.openStream());
FileOutputStream fileOutputStream = new FileOutputStream(savePath);
byte[] buffer = new byte[1024];
int count = 0;
while ((count = bufferedInputStream.read(buffer, 0, 1024)) != -1) {
fileOutputStream.write(buffer, 0, count);
}
bufferedInputStream.close();
fileOutputStream.close();
}
//执行程序结束操作
public static void die(String msg) {
if (msg != "") {
System.out.println(msg);
}
System.exit(1);
}
}
最后
以上就是优雅冬天为你收集整理的Java下载汉服图片一、前言二、java代码的全部内容,希望文章能够帮你解决Java下载汉服图片一、前言二、java代码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复