zoukankan      html  css  js  c++  java
  • Java jsoup多线程爬虫(爬豆瓣图书封面)

    Java爬虫,就先爬个好爬的豆瓣读书的封面。

    Java jsoup多线程爬虫(爬豆瓣图书封面)

    利用线程池多线程爬,biubiubiu,速度超快。

    下载到指定的文件夹中。

    App.java:

    package com.newer.spider;
    
    import java.io.IOException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    
    public class App {
    
        public static void main(String[] args) {
            
            // 确定目标地址 URL 统一资源定位符
            String url="https://book.douban.com/";
            
            // 2 解析 html :  https://jsoup.org
            try {
                //
                Document doc = Jsoup.connect(url).get();
                
    //            System.out.println(doc.title());
    //            System.out.println(doc.html());
                
                //从 Doc 的树形结构中查找 img 标签
                //.class 选择器
                Elements els = doc.select(".cover img");
                System.out.println(els.size());
                
                
                // 创建一个线程池
                //.class 选择器
                ExecutorService pool = Executors.newCachedThreadPool();
                pool = Executors.newFixedThreadPool(9);
    //            pool = Executors.newSingleThreadExecutor();
                
                for(Element e : els) {
                    // <img src=""  width=""  height="" />
                    String src = e.attr("src");
                    System.out.println(src);
                    
                    // 下载每张图片
                    pool.execute(new DownloadTask(src));
                }
                //释放资源
                pool.shutdown();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    package com.newer.spider;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    
    import javax.net.ssl.HttpsURLConnection;
    
    /**
     * 负责下载图片的任务,可以由线程执行 (Runnable)
     * 
     * @author zmz
     *
     */
    public class DownloadTask implements Runnable {
    
        //图片的路径
        String imagePath;
        /**
         * 
         * @param src
         *            图片的位置和路径
         */
        public DownloadTask(String src) {
            imagePath = src;
        }
    
        @Override
        public void run() {
             
            //建立一个HTTP连接,使用输入流获得数据,使用输出流写入磁盘
            HttpURLConnection conn = null;
            InputStream in = null;
            FileOutputStream out = null;
            
            try {
                conn = (HttpURLConnection) new URL(imagePath).openConnection();
                //读取数据
                in = conn.getInputStream();
                String uu = "G:\Newer_Project\Spider\img\";
                //获得图片的名字
                int index = imagePath.lastIndexOf('/');
                String file = imagePath.substring(index + 1);
                file = uu + file;
                //创建输出流,写入
                out = new FileOutputStream(file);
                
                byte[] buf = new byte[1024 + 16];
                int size;
                while(-1 != (size = in.read(buf))) {
                    out.write(buf, 0, size);
                }
                //下载完成
                String name = Thread.currentThread().getName();
                System.out.println(name + "下载" + imagePath);
                
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //不论是否发生异常都会执行的
                if(out != null) {
                    try {
                        out.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                
                if(conn != null) {
                    conn.disconnect();
                }
            }
        }
    
    }

    后续是不是可以翻页爬的,因为这个只是爬当前页面的,豆瓣读书网的书还有很多页,我们爬完这一页的,继续爬下一页?

  • 相关阅读:
    WinForm换行
    aspx获取页面间传送的值
    Response.BinaryWrite()方法输出二进制图像
    Jquery删除table的行和列
    WinForm DataGridView控件隔行变色
    IE中table的innerHTML无法赋值
    C#为IE添加可信任站点
    静态代码检查
    第三方开源小工具
    查看sql server 服务器内存使用情况
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7580282.html
Copyright © 2011-2022 走看看