java多线程爬取养眼福利图片(懂得都懂,带注释)

上次做了个python版的福利爬虫,不过咱主业还是java,所以再发个java版本的,附带每一步的注释,又看不懂的地方欢迎提问首先导入jar包,我这里用的maven,没有maven的可以自己在网上下载jsoup包,版本就下最近的就行
 

<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();
                }
            }
        }
    }
}

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

 加端端老师免费领取更多Java资料

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值