`
guzizai2007
  • 浏览: 359633 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

用Jsoup抓取长颈鹿但丁图片

 
阅读更多

(官网似乎已改版,此代码没用了)

1、pom文件配置或者添加jsoup1.6.3jar包:

	<dependencies>
		<dependency>
			<groupId>org.jsoup</groupId>
			<artifactId>jsoup</artifactId>
			<version>1.6.3</version>
		</dependency>
	</dependencies>

2、 抓取长颈鹿但丁图片URL:

package com.sxit.jsoup;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 * 功能:抓取长颈鹿但丁图片
 * 类名:jsoupPic
 * 作者:smile
 * 时间:Nov 11, 2012:2:17:57 PM
 */
public class jsoupPic {

	public static List<String> getDocument() {

		List<String> list = new ArrayList<String>();
		try {
			Connection con = null;
			// 分页后缀
			String[] a = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" };
			// 遍历语录漫画下面四个项目(哲理、职场、爱情、恶搞)
			for (int i = 1; i <= 4; i++) {
				// 单个项目的第一页url
				String url = "http://www.danding.com.cn/pic_fl_" + i + ".html";
				// 建立连接
				con = Jsoup.connect(url);
				// 获取页面document
				Document doc = con.get();
				// 获取末尾是jpg的img标签元素
				Elements e = doc.select("img[src$=.jpg]");
				// 遍历第一页jpg图片的路径
				for (int j = 0; j < e.size(); j++) {
					Element ei = e.get(j);
					// System.out.println("第"+i+"页图片地址为----------->>>>>
					// http://www.danding.com.cn/"+ei.attr("src"));
					list.add("http://www.danding.com.cn/" + ei.attr("src"));
				}

				int flag = 0;

				while (flag == 0) {
					// 当前页是否存在下一页
					boolean isExist = true;
					isExist = isExistsNextPage(doc);
					int k = 0;
					while (isExist) {
						// System.out.println("----------------->>>存在下一页");
						// 下一页的url地址
						url = "http://www.danding.com.cn/pic_fl_" + i + a[k] + ".html";
						doc = traverse(url, list);
						isExist = isExistsNextPage(doc);
						k++;
					}
					flag = 1;
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return list;
	}

	/**
	 * 判断是否有下一页
	 * 
	 * @param doc
	 * @return
	 */
	public static boolean isExistsNextPage(Document doc) {

		// 判断当前页是否还有下一页
		Elements e = doc.select(":containsOwn(下一页)");
		if (e.size() > 0) { // 有下一页
			return true;
		} else
			return false;
	}

	/**
	 * 遍历document
	 * 
	 * @param list
	 * @param doc
	 * @throws IOException
	 */
	public static Document traverse(String src, List<String> list) throws IOException {

		Connection con = Jsoup.connect(src);
		Document doc = con.get();
		// 获取末尾是jpg的标签元素
		Elements e = doc.select("img[src$=.jpg]");

		for (int j = 0; j < e.size(); j++) {
			Element ei = e.get(j);
			list.add("http://www.danding.com.cn/" + ei.attr("src"));
		}
		return doc;
	}
}

3、批量下载到本地:

package com.sxit.jsoup;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 功能:批量下载
 * 类名:ThreadPoolManage
 * 作者:smile
 * 时间:Nov 11, 2012:6:02:49 PM
 */
public class ThreadPoolManage {

	final ExecutorService exec = Executors.newFixedThreadPool(20);

	private String filePath;

	private List<String> list;

	// 结束的倒数锁
	final CountDownLatch stop = new CountDownLatch(20);

	public static void main(String[] args) {
		new ThreadPoolManage("D://xxooThread");
	}

	public ThreadPoolManage(String filePath) {

		list = jsoupPic.getDocument();
		// 启20个线程跑,每个线程只跑总数的1/20,第一个线程跑1-->list.size()/20,
		// 第二个线程从list.size()/20+1-->2*list.size()/20,最后一个线程则跑(n-1)*list.size()/20+1-->list.size()
		for (int i = 1; i <= 20; i++) {
			this.exec.submit(new ImageThread(i, filePath, list, stop));
		}

		try {
			// 等待stop变为0
			stop.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		// 等所有线程跑完最后关闭ExecutorService
		exec.shutdown();
	}
}

class ImageThread implements Runnable {

	private String filePath;

	private List<String> list;

	private int index;

	private final CountDownLatch stop;

	public ImageThread(int index, String filePath, List<String> ilistst, CountDownLatch stop) {
		this.index = index;
		this.filePath = filePath;
		this.list = ilistst;
		this.stop = stop;
	}

	public void run() {

		String picUrl = "";
		InputStream is = null;
		OutputStream os = null;
		URL url = null;
		HttpURLConnection con = null;

		// 判断保存路径是否存在 不存在则新建文件夹
		File f = new File(filePath);
		File temp = null;
		if (!f.exists()) {
			f.mkdir();
		}

		if (list != null) {
			// 每次需要跑的数目
			int count = list.size() / 20;
			int start = (index - 1) * count + 1;
			int end = 0;
			if (index != 20) {
				end = index * count;
			} else {
				end = list.size() - 1;
			}

			for (int i = start; i <= end; i++) {
				picUrl = list.get(i);

				try {
					url = new URL(picUrl);
					con = (HttpURLConnection) url.openConnection();
					// 设置连接超时
					con.setConnectTimeout(100 * 1000);
					// 设置读取超时
					con.setReadTimeout(100 * 1000);
					is = new BufferedInputStream(con.getInputStream());
					os = new BufferedOutputStream(new FileOutputStream(new File(filePath + "/" + i + ".jpg")));
					byte[] b = new byte[1024];
					int length = 0;
					while ((length = is.read(b)) != -1) {
						os.write(b, 0, length);
					}
					os.flush();
					System.out.println(index + "号线程----------------->>>>>>>保存完第" + i + "张");
				} catch (Exception e) {
					System.out.println(index + "号线程跑到第" + start + "张图片+++++++++++++抛出异常,异常信息为:" + e.getMessage());
					// 抛出异常捕获,继续执行
					continue;
				}
			}

			try {
				if (is != null) {
					is.close();
				}
				if (os != null) {
					os.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				// 当前线程完成,减1
				this.stop.countDown();
			}
		}
	}
}

3、源码如下 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    httpClient+jsoup 抓取网页数据

    HttpClient和Jsoup是两个Java库,分别专注于HTTP通信和HTML解析,它们常被组合使用来高效地抓取网页数据。下面我们将详细探讨这两个库及其在网页抓取中的应用。 HttpClient是由Apache软件基金会开发的一个库,主要...

    Jsoup抓取整个网站

    在本篇中,我们将深入探讨如何使用Jsoup来抓取整个网站,并将其保存到本地,包括CSS、JavaScript、图片以及各个页面。 首先,我们需要了解Jsoup的基本用法。Jsoup通过建立一个HTTP连接到目标网站,然后解析返回的...

    jsoup抓取网页内容

    这是一个使用jsoup抓取网页内容的例子,适合从事手机开发的初学者学习

    Java使用Jsoup抓取网页关键信息并入库

    在"Java使用Jsoup抓取网页关键信息"这部分,我们需要了解以下几个知识点: 1. **Jsoup连接与解析网页**:使用Jsoup的`connect()`方法建立HTTP连接,然后通过`get()`或`post()`发送请求获取网页内容。获取到的HTML...

    jsoup抓取网页教程

    很实用的jsoup抓取网页教程,通过查看此文档,您可以解决你在抓取网页过程中出现的问题

    使用Jsoup,抓取整个网站(包括图片、js、css)

    在这个项目中,我们使用Jsoup配合Java,实现了抓取整个网站的功能,包括其中的图片、CSS样式表和JavaScript文件。通过这样的工具,我们可以对网页进行离线浏览或者备份,甚至进行数据分析。 首先,我们要理解Jsoup...

    用jsoup抓取网页数据

    **Jsoup:网页数据抓取与JSON转换** Jsoup是一个非常强大的...通过以上步骤,你已经掌握了使用Jsoup抓取网页数据并转化为JSON格式的基本方法。在实际应用中,可以根据需求进行定制和扩展,以满足各种复杂场景的需求。

    Jsoup抓取一个完整的网站.rar

    在这个"Jsoup抓取一个完整的网站.rar"压缩包中,你将找到一个示例项目,教你如何使用Jsoup配合Java来抓取一个网站的所有资源,包括图片、CSS样式表和JavaScript文件,并在本地按照原始网站的目录结构进行保存。...

    java+jsoup抓取网页数据

    以下是关于如何使用Java+Jsoup抓取网页数据的详细讲解。 首先,你需要了解HTML的基础结构,因为Jsoup的工作原理是解析HTML文档并提供类似于DOM的API来操作这些文档。HTML是由标签组成的树形结构,每个标签都有属性...

    使用Jsoup抓取网页关键信息并入库 ip天气查询并发送邮件

    本项目将讲解如何使用Jsoup来抓取网页的关键信息,并将其存储到数据库中,同时实现通过IP地址查询天气并以邮件形式发送。 首先,Jsoup提供了简洁的API,使得解析HTML变得易如反掌。我们可以利用Jsoup的`connect()`...

    Jsoup抓取实例

    同时,对于动态加载的内容,可能需要利用Selenium等工具先触发页面的JavaScript执行,然后再用Jsoup抓取。 在提供的"coolook_self"压缩包文件中,可能包含了一个自定义的Jsoup抓取示例。这可能是一个Java项目,其中...

    Android项目源码简单利用jsoup爬取学校内网数据

    本项目是一个基于安卓的简单利用jsoup爬取学校内网数据的教务系统app,设计的部分有:个人信息、课程表、考试时间、考勤信息、成绩查询、奖惩情况、开设课程、晚归违规等部分。主要思路就是利用jsoup爬数据把数据转化...

    安卓listview相关相关-实现浏览新浪新闻jsoup抓取网页信息listview列表下拉刷新.rar

    在本项目中,开发者使用Jsoup连接到新浪新闻网站,通过选择器抓取新闻标题、摘要等信息。这通常涉及到以下步骤: 1. 使用Jsoup的`connect()`方法建立与目标URL的连接。 2. 调用`get()`或`post()`方法发送HTTP请求并...

    jsoup从网络上抓取图片

    在本教程中,我们将重点讨论如何使用JSoup从网络上抓取并下载图片。 **步骤一:设置依赖** 在开始之前,确保你的项目已经添加了JSoup库的依赖。如果你使用Maven,可以在pom.xml文件中添加以下依赖: ```xml ...

    安卓listview相关相关-使用jsoup异步抓取新闻数据装载listview(仿开源中国资讯列表.rar

    本示例是关于如何使用Jsoup库异步抓取网络上的新闻数据,并将其填充到ListView中,模仿开源中国的资讯列表。Jsoup是一个强大的Java库,它使得解析HTML文档、提取和修改数据变得简单。 首先,我们需要了解Jsoup的...

    httpClient+jsoup抓取网页数据实例和jar包

    以下是一个简单的示例,展示如何使用HttpClient获取网页内容,然后用Jsoup解析: ```java import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache....

    jsoup1.8.1抓取爬虫工具

    例如,新闻聚合应用可能会使用jsoup抓取多个网站的新闻标题,社交媒体分析工具可能利用它提取用户评论,而开发者则可能用它来测试网页的HTML结构是否符合预期。 总的来说,jsoup1.8.1是一个强大的HTML解析和数据...

    jsoup多线程爬虫

    此外,项目中可能还包含了`jsoupDemo.docx`文件,这可能是一个详细的文档,包含了更多关于如何使用jsoup和多线程抓取新闻的步骤和示例代码。而`jsoup-1.10.2.jar`是jsoup库的版本,确保将其添加到项目的类路径中,...

Global site tag (gtag.js) - Google Analytics