Java实现多线程爬虫

项目介绍

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

知识储备

  • jsoup的使用
  • java线程池的使用
  • URL类、URLConnection类及流的处理

开发步骤

分析源代码

Java实现多线程爬虫_第1张图片

	分析发现,所有书都存在与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 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("没办法了");
       }
      }
      }
      }
    

你可能感兴趣的:(基于java的网络程序设计)