java实现爬虫爬网站图片

第一步,实现 LinkQueue,对url进行过滤和存储的操作

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class LinkQueue {

	// 已访问的 url 集合
	private static Set<String> visitedUrl = Collections.synchronizedSet(new HashSet<String>());

	// 未访问的url
	private static List<String> unVisitedUrl = Collections.synchronizedList(new ArrayList<String>());
	
	// 未访问的URL出队列
	public static String unVisitedUrlDeQueue() {
		if (unVisitedUrl.size() > 0) {
			String url = unVisitedUrl.remove(0);
			visitedUrl.add(url);
			return url;
		}
		return null;
	}
	
	
	
	// 新的url添加进来的时候进行验证,保证只是添加一次
	public static void addUnvisitedUrl(String url) {
		if (url != null && !url.trim().equals("") && !visitedUrl.contains(url)
				&& !unVisitedUrl.contains(url))
			unVisitedUrl.add(url);
	}
	
	// 判断未访问的URL队列中是否为空
	public static boolean unVisitedUrlsEmpty() {
		return unVisitedUrl.isEmpty();
	}
	
}

第二步,收集每一个url下的链接进行过滤产生新的链接

import java.util.HashSet;
import java.util.Set;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;

/**
 * 过滤http的url,获取可以符合规则的url
 * @author Administrator
 *
 */
public class ParserHttpUrl {
	
	// 获取一个网站上的链接,filter 用来过滤链接
	public static Set<String> extracLinks(String url, LinkFilter filter) {
		Set<String> links = new HashSet<String>();
		try {
			Parser parser = new Parser(url);
			// 过滤 <frame >标签的 filter,用来提取 frame 标签里的 src 属性所表示的链接
			NodeFilter frameFilter = new NodeFilter() {
				public boolean accept(Node node) {
					if (node.getText().startsWith("frame src=")) {
						return true;
					} else {
						return false;
					}
				}
			};
			// OrFilter 来设置过滤 <a> 标签,和 <frame> 标签
			OrFilter linkFilter = new OrFilter(new NodeClassFilter(
					LinkTag.class), frameFilter);
			// 得到所有经过过滤的标签
			NodeList list = parser.extractAllNodesThatMatch(linkFilter);
			for (int i = 0; i < list.size(); i++) {
				Node tag = list.elementAt(i);
				if (tag instanceof LinkTag)// <a> 标签
				{
					LinkTag link = (LinkTag) tag;
					String linkUrl = link.getLink();// url
					if (filter.accept(linkUrl))
						links.add(linkUrl);
				} else// <frame> 标签
				{
					// 提取 frame 里 src 属性的链接如 <frame src="test.html"/>
					String frame = tag.getText();
					int start = frame.indexOf("src=");
					frame = frame.substring(start);
					int end = frame.indexOf(" ");
					if (end == -1)
						end = frame.indexOf(">");
					String frameUrl = frame.substring(5, end - 1);
					if (filter.accept(frameUrl))
						links.add(frameUrl);
				}
			}
		} catch (ParserException e) {
			e.printStackTrace();
		}
		return links;
	}
}

第三步,实现图片下载功能  

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/***
 * java抓取网络图片
 * 
 * @author swinglife
 * 
 */
public class DownLoadPic {

	// 编码
	private static final String ECODING = "UTF-8";
	// 获取img标签正则
	private static final String IMGURL_REG = "<img.*src=(.*?)[^>]*?>";
	// 获取src路径的正则
	private static final String IMGSRC_REG = "http:\"?(.*?)(\"|>|\\s+)";

	public static void downloadPic(String url) {
		// 获得html文本内容
		String HTML = null;
		try {
			HTML = DownLoadPic.getHTML(url);
		} catch (Exception e) {
			e.printStackTrace();
		}
		if (null != HTML && !"".equals(HTML)) {

			// 获取图片标签
			List<String> imgUrl = DownLoadPic.getImageUrl(HTML);
			// 获取图片src地址
			List<String> imgSrc = DownLoadPic.getImageSrc(imgUrl);
			// 下载图片
			DownLoadPic.download(imgSrc);
		}
	}

	/***
	 * 获取HTML内容
	 * 
	 * @param url
	 * @return
	 * @throws Exception
	 */
	private static String getHTML(String url) throws Exception {
		URL uri = new URL(url);
		URLConnection connection = uri.openConnection();
		InputStream in = connection.getInputStream();
		byte[] buf = new byte[1024];
		int length = 0;
		StringBuffer sb = new StringBuffer();
		while ((length = in.read(buf, 0, buf.length)) > 0) {
			sb.append(new String(buf, ECODING));
		}
		in.close();
		return sb.toString();
	}

	/***
	 * 获取ImageUrl地址
	 * 
	 * @param HTML
	 * @return
	 */
	private static List<String> getImageUrl(String HTML) {
		Matcher matcher = Pattern.compile(IMGURL_REG).matcher(HTML);
		List<String> listImgUrl = new ArrayList<String>();
		while (matcher.find()) {
			listImgUrl.add(matcher.group());
		}
		return listImgUrl;
	}

	/***
	 * 获取ImageSrc地址
	 * 
	 * @param listImageUrl
	 * @return
	 */
	private static List<String> getImageSrc(List<String> listImageUrl) {
		List<String> listImgSrc = new ArrayList<String>();
		for (String image : listImageUrl) {
			Matcher matcher = Pattern.compile(IMGSRC_REG).matcher(image);
			while (matcher.find()) {
				listImgSrc.add(matcher.group().substring(0,
						matcher.group().length() - 1));
			}
		}
		return listImgSrc;
	}

	/***
	 * 下载图片
	 * 
	 * @param listImgSrc
	 */
	private static void download(List<String> listImgSrc) {

		for (String url : listImgSrc) {
			try {
				String imageName = url.substring(url.lastIndexOf("/") + 1,
						url.length());
				
				URL uri = new URL(url);
				InputStream in = uri.openStream();
				FileOutputStream fo = new FileOutputStream(new File(imageName));
				byte[] buf = new byte[1024];
				int length = 0;
				while ((length = in.read(buf, 0, buf.length)) != -1) {
					fo.write(buf, 0, length);
				}
				in.close();
				fo.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

}

实在Filter接口,定义过滤接口:

public interface Filter {

	public boolean accept(String url);
}
第四步,过滤规则的实现:

public class Crawler {

	/**
	 * 抓取过程
	 * 
	 * @return
	 * @param seeds
	 */
	public void crawling(String url) { // 定义过滤器
		
		Filter filter = new Filter() {
			public boolean accept(String url) {
				//这里过滤规则随需要爬的网站的规则进行改变,推荐使用正则实现,本人是爬豆瓣网站
				if(url.indexOf("douban.com/group/topic") != -1 || url.indexOf("douban.com/group/haixiuzu/discussion?start") != -1 )
					return true;
				else
					return false;
			}
		};
		// 初始化 URL 队列
		LinkQueue.addUnvisitedUrl(url);
		
		// 循环条件,待抓取的链接不空
		while (!LinkQueue.unVisitedUrlsEmpty()) {
			// 队头URL出队列
			String visitUrl = (String) LinkQueue.unVisitedUrlDeQueue();
			if (visitUrl == null)
				continue;
			
			DownLoadPic.downloadPic(visitUrl);

			// 提取出下载网页中的 URL
			Set<String> links = ParserHttpUrl.extracLinks(visitUrl, filter);
			// 新的未访问的 URL 入队
			for (String link : links) {
				LinkQueue.addUnvisitedUrl(link);
			}
		}
	}

	// main 方法入口
	public static void main(String[] args) {
		Crawler crawler = new Crawler();
		crawler.crawling("http://www.douban.com/group/haixiuzu/discussion?start=0");
	}
}



  • 10
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 23
    评论
### 回答1: 好的,我会尽力回答你的问题。 要写一个爬取图片爬虫,你可以使用 Java 的网络编程库来发送 HTTP 请求并解析 HTML 页面。在这里,我们假设你已经了解了 Java 基础知识,包括如何编写程序、创建类和对象、使用循环和条件语句等。 首先,你需要导入 Java 的网络编程库,例如 java.net.URL 和 java.net.HttpURLConnection。然后,你可以使用这些类来打开一个连接到指定网站的流,并使用流来读取网站的 HTML 内容。 接下来,你可以使用正则表达式或者其他方法来解析 HTML 页面,并提取你想要的图片链接。最后,你可以使用 Java 的 I/O 类(例如 java.io.BufferedInputStream 和 java.io.FileOutputStream)来下载图片并将它们保存到本地。 下面是一个简单的例子,展示了如何使用 Java 的网络编程库来发送 HTTP 请求并读取返回的 HTML 内容: ``` import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class Main { public static void main(String[] args) { try { // 创建一个 URL 对象 URL url = new URL("http://www.example.com"); // 打开一个 HTTP 连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // 设置请 ### 回答2: 要编写一个使用Java编写的爬虫爬取图片,可以按照以下步骤进行操作: 1. 首先,引入相关的Java类库,如Jsoup等,以便处理HTML页面和网络请求。 2. 使用Jsoup库发送HTTP GET请求,获取目标网页的HTML源代码。 3. 解析HTML源代码,通过Jsoup提供的DOM操作方法,从中提取出所有图片的URL链接。 4. 通过网络请求,逐一下载这些图片。可以使用Java的URL和URLConnection类来发送HTTP请求,将图片保存到本地文件系统中。 5. 针对爬取图片,可以设定一些过滤条件,如文件的大小、尺寸、类型等,以确保只下载符合要求的图片。 以下是一个示例代码片段,用于演示上述步骤: ```java import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; public class ImageCrawler { public static void main(String[] args) { String targetUrl = "http://example.com"; // 目标网页的URL地址 try { // 发送HTTP GET请求,获取HTML源代码 Document document = Jsoup.connect(targetUrl).get(); // 从HTML源代码中提取所有图片的URL链接 Elements imgTags = document.select("img"); for (Element imgTag : imgTags) { String imgUrl = imgTag.absUrl("src"); if (imgUrl.startsWith("http")) { // 下载图片 saveImage(imgUrl); } } } catch (IOException e) { e.printStackTrace(); } } public static void saveImage(String imageUrl) throws IOException { URL url = new URL(imageUrl); URLConnection conn = url.openConnection(); try (InputStream in = conn.getInputStream(); FileOutputStream out = new FileOutputStream("path/to/save/image.jpg")) { byte[] buffer = new byte[1024]; int length; while ((length = in.read(buffer)) != -1) { out.write(buffer, 0, length); } } } } ``` 以上示例代码仅实现了简单的图片爬取功能,仍有一些细节需要根据实际需求进行补充。例如,在下载图片时,可以使用多线程或使用线程池来提高效率。此外,还应添加异常处理、日志记录、合适的HTTP请求头等功能,以防止被目标网站封禁或触发反爬虫机制。 ### 回答3: 要用Java写一个爬取图片爬虫,可以使用Jsoup库来实现。以下是大致的步骤和代码示例: 步骤一:导入Jsoup库 首先,需要确保已经将Jsoup库添加到Java项目中。可以在Maven或Gradle的项目配置文件中添加相应的依赖项,或者手动下载并添加Jsoup.jar文件。 步骤二:编写爬虫代码 1. 创建一个Java类,比如名为ImageCrawler的类。 ```java import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.URL; public class ImageCrawler { public static void main(String[] args) { String url = "https://www.example.com"; // 设置目标网站的URL try { Document doc = Jsoup.connect(url).get(); // 获取网页内容 Elements images = doc.select("img[src]"); // 获取所有图片元素 for (Element img : images) { String imageURL = img.absUrl("src"); // 获取图片的绝对URL // 下载图片到本地 String fileName = imageURL.substring(imageURL.lastIndexOf('/') + 1); URL imageURLObj = new URL(imageURL); BufferedInputStream in = new BufferedInputStream(imageURLObj.openStream()); BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(fileName)); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = in.read(buffer, 0, 1024)) != -1) { out.write(buffer, 0, bytesRead); } out.close(); in.close(); } } catch (IOException e) { e.printStackTrace(); } } } ``` 2. 在上述代码中,首先指定目标网站的URL。然后,使用Jsoup的connect方法获取网页内容,并选择所有img标签。通过遍历图片元素,可以获取图片的绝对URL,然后使用java.net包中的相关类下载图片到本地。 步骤三:运行爬虫 保存并编译上述Java类后,可以运行它来启动爬虫爬虫将会将目标网站上的所有图片下载到当前工作目录。 请注意,根据目标网站的不同,还可能需要做一些额外的处理,比如处理相对URL,或者设置请求头部信息,以避免被反爬虫机制拦截。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值