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) { // 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(); } } } }
后续是不是可以翻页爬的,因为这个只是爬当前页面的,豆瓣读书网的书还有很多页,我们爬完这一页的,继续爬下一页?