我是靠谱客的博主 优雅冬天,最近开发中收集的这篇文章主要介绍Java下载汉服图片一、前言二、java代码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

  • 一、前言
  • 二、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代码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部