Java实现多线程爬虫

项目介绍

该项目是《网络程序设计》老师布置的一个作业,让完成:
	给定一个网址,获取该网站中所有的图片(重要的,图标哪些就不算了),实现多线程下载,自动爬取。
	我做的项目爬取的是孔夫子二手书官网的计算机类的所有书籍的图片:http://item.kongfz.com/Cjisuanji/

知识储备

开发步骤

分析源代码

在这里插入图片描述

	分析发现,所有书都存在与id=”listBox“中,每个书的class=”item clearfix“,所以可以使用jsoup的getElementById获取到所有书,然后使用getElementByClass获取书的列表,循环获取每本书。
	而书的图片放在了class="img-box"的a标签中的img标签中,可以使用先到达a标签,然后使用getElementByTag()获取img,获取后的attr("src")就是图片的url。
源码
  • 主程序(CrawlImage.java)
package crawlimage;
import java.util.*;
import java.io.*;
//引入线程池的包
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

//引入jsoup的包
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;


public class CrawImage {
    
    public static void getUrl(Document document,ExecutorService pool){
        Element id = document.getElementById("listBox");
            Elements els = id.getElementsByTag("img");
            
            for(Element el : els){
                //url.add(el.attr("src"));
                String imageUrl = el.attr("src");
                pool.execute(new DownloadImage(imageUrl));
                System.out.println(el.attr("src"));
            }
            
    }
    public static void main(String[] args) throws Exception{
        //Set<String> url = new TreeSet<>();
        try{
            //创建一个缓冲池
            ExecutorService pool = Executors.newCachedThreadPool();
            //设置其容量为9
            pool = Executors.newFixedThreadPool(9);
            
            //获取指定网页源码
            Document document = Jsoup.connect("http://item.kongfz.com/Cjisuanji/w2/").userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31").get();
            getUrl(document,pool);
            int a = 4;
            while(a--!=0){
                Element el = document.getElementById("pagerBox");
                Elements el2 = el.getElementsByClass("next-btn");
                if(el2 == null){
                    System.out.println("到最后了");
                    break;
                }
                String urlIndex = el2.attr("href");
                Document document2 = Jsoup.connect(urlIndex).userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31").get();
                getUrl(document2,pool);
            }
            
            //遍历set中图片的url
//            for(String imageUrl:url){
//                pool.execute(new DownloadImage(imageUrl));
//            }
            pool.shutdown();
            
        }catch(Exception e){
            System.out.print(e);
        }
    }
    
}
  • 多线程下载程序(DownloadImage.java)

      package crawlimage; 
      import java.io.*;
      import java.net.*;
      
      public class DownloadImage implements Runnable{
          String downUrl;
          public DownloadImage(String downUrl){
              this.downUrl = downUrl;
          }
          public void run(){
              BufferedInputStream bis = null;
              FileOutputStream fos = null;
              try{
                  //生成url对象
                  URL url = new URL(downUrl);
                  //创建urlconnection对象
                  URLConnection uc = url.openConnection();
                  //获取uc的输入流
                  bis = new BufferedInputStream(uc.getInputStream());
                  //创建图片的存储对象
                  String[] p = downUrl.split("/");
                  String path = "F:\\test\\"+p[p.length-1];
                  fos = new FileOutputStream(path);
                  int c;
                  while((c=bis.read())!=-1){
                      fos.write(c);
                  }            
              }catch(Exception e){
                  System.out.println(e);
              }finally{
                  try{
       if(bis!=null){
           bis.close();
       }
    
       if(fos!=null){
           fos.close();
       }
       }catch(Exception e){
           System.out.println("没办法了");
       }
      }
      }
      }
    
  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淮左青衣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值