吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6732|回复: 26
收起左侧

[Java 转载] 多线程爬取养眼福利图片(懂得都懂,带注释)

[复制链接]
三木猿 发表于 2020-9-7 10:49
上次做了个python版的福利爬虫,不过咱主业还是java,所以再发个java版本的,附带每一步的注释,又看不懂的地方欢迎提问首先导入jar包,我这里用的maven,没有maven的可以自己在网上下载jsoup包,版本就下最近的就行
[XML] 纯文本查看 复制代码
<dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.11.2</version>
</dependency>

然后粘出正经人都喜欢的正经代码
[Java] 纯文本查看 复制代码
import org.jsoup.Connection;
import org.jsoup.HttpStatusException;
import org.jsoup.Jsoup;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * [url=home.php?mod=space&uid=686208]@AuThor[/url] 三木猿
 * [url=home.php?mod=space&uid=1248337]@version[/url] 1.0
 * @Title:
 * [url=home.php?mod=space&uid=686237]@date[/url] 2020/9/7 10:43
 */
public class test2 {

    public static void main(String[] args) {
        try {
            List<Thread> threads=new ArrayList<>(3);
            //开始时间
            long start = System.currentTimeMillis();
            //循环启动3个线程,每个线程下10个文件夹的图片
            for (int i = 0; i < 3; i++) {
                final int ins=i;
                Thread thread = new Thread(() -> {
                    try {
                        System.out.println("线程"+Thread.currentThread().getName()+"正在运行");
                        //开始下载
                        downloadImg(10*ins, (ins+1)*10);
                    } catch (Exception e) {
                        e.printStackTrace();

                    }
                });
                thread.start();
                threads.add(thread);
            }
            //join不能放在循环中,不然就失去了多线程的意义,join方法就是让线程运行结束后才能继续执行,要学多线程的可以试试去掉join会怎么样
            for (Thread thread : threads) {
                thread.join();
            }
            //结束时间
            long end = System.currentTimeMillis();
            System.out.println("所有下载已完成,本次共用时"+(end-start)/1000+"s");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void downloadImg(int start, int end) throws Exception {
        //参数校验
        if (start > end) {
            System.out.println("输入的参数有误");
        }
        for (int i = start; i < end; i++) {
            //图片地址
            String url = "https://lns.hywly.com/a/1/" + i + "/";
            //一个文件夹文件数量上限为100
            int count = 100;
            for (int j = 0; j < count; j++) {
                //要创建的文件夹地址
                String src = "d:/SanMu/image/" + i + "/";
                
                File file1 = new File(src + j + ".jpg");
                //先验证当前图片是否已经存在,存在就跳过
                if (!file1.exists()) {
                    Connection.Response execute = null;
                    try {
                        //ignoreContentType忽略请求类型,这里可以自己试试,不加会报这个异常
                        // Unhandled content type. Must be text/*, application/xml, or application/xhtml+xml. Mimetype=application/json;charset=UTF-8,
                        execute = Jsoup.connect(url + j + ".jpg").ignoreContentType(true).execute();
                    } catch (HttpStatusException httpStatusException) {
                        //404时跳过当前下载,因为不知道每一套图片有多少张,所以设定当获取的页面是404时就结束
                        break;
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    //只有在条件成立时才会继续往下运行,相当于if判断
                    assert execute != null;
                    File file = new File(src);
                    //当前文件夹不存在时,创建
                    if (!file.exists()) {
                        file.mkdir();
                    }
                    //创建图片文件
                    file1.createNewFile();
                    //保存图片
                    //这样写的好处是可以充分关闭,不让文件流占用资源
                    FileOutputStream fos = new FileOutputStream(file1);
                    BufferedOutputStream bos = new BufferedOutputStream(fos);
                    bos.write(execute.bodyAsBytes());
                    bos.close();
                    fos.close();
                }
            }
        }
    }
}

最后是运行截图,最后给句忠告不要把线程数改的太多,要是把网站弄崩了,那福利可就没啦
image.png

免费评分

参与人数 2吾爱币 +1 热心值 +2 收起 理由
Qaxbw + 1 牛逼
xxxlsy + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 三木猿 发表于 2020-9-18 13:10
dzqaww 发表于 2020-9-18 13:05
网站已经炸了....

https://www.tujigu.com/原网址,别说没撒福利
 楼主| 三木猿 发表于 2020-9-18 13:08
dzqaww 发表于 2020-9-18 13:05
网站已经炸了....

上面的网址是图片服务器,本身就是打不开的,必须输入对文件夹名才能访问到
steven11001 发表于 2020-9-7 10:58
xcsun333 发表于 2020-9-7 11:04
感谢楼主分享,好东东哦
南下长毛熊 发表于 2020-9-7 11:08
能放个成品吗?
yy11911 发表于 2020-9-7 11:13
谢谢  谢谢   谢谢
niu645509965 发表于 2020-9-7 11:14
下载了代码学习
Sky_曦 发表于 2020-9-7 11:24
代码已进行深入学习,感谢分享
奔放的汉子 发表于 2020-9-7 11:30
疯狂试探
mcumail 发表于 2020-9-7 11:30
楼主的技术都用到点子上了
jokony 发表于 2020-9-7 11:32
哈哈,,厉害了。。。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 19:44

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表