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

来源:互联网 发布:phpcms源码 编辑:程序博客网 时间:2024/05/16 05:05

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

用的是第三方库jsoup,也有其他的比如WebMagic之类的

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

下载到指定的文件夹中。


App.java:

package com.zmz.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.zmz.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();            }        }    }}


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

阅读全文
0 0
原创粉丝点击