三木猿 发表于 2020-9-7 10:49

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

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

然后粘出正经人都喜欢的正经代码
import org.jsoup.Connection;
import org.jsoup.HttpStatusException;
import org.jsoup.Jsoup;

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

/**
* @AuThor 三木猿
* @version 1.0
* @Title:
* @date 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();
                }
            }
      }
    }
}

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

三木猿 发表于 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

能放个成品吗?{:301_974:}

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

楼主的技术都用到点子上了{:1_918:}

jokony 发表于 2020-9-7 11:32

哈哈,,厉害了。。。
页: [1] 2 3
查看完整版本: 多线程爬取养眼福利图片(懂得都懂,带注释)