吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

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

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

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

然后粘出正经人都喜欢的正经代码
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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, 2025-4-10 22:15

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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