第一步,实现 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>());// 未访问的urlprivate 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();// urlif (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;elsereturn false;}};// 初始化 URL 队列LinkQueue.addUnvisitedUrl(url);// 循环条件,待抓取的链接不空while (!LinkQueue.unVisitedUrlsEmpty()) {// 队头URL出队列String visitUrl = (String) LinkQueue.unVisitedUrlDeQueue();if (visitUrl == null)continue;DownLoadPic.downloadPic(visitUrl);// 提取出下载网页中的 URLSet<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");}
}

java实现爬虫爬网站图片相关推荐

  1. 用Java做爬虫爬取王者荣耀的英雄头像

    大家好,今天我和大家分享一下用Java做爬虫爬取王者荣耀的英雄头像. 首先我们需要王者荣耀的网址,然后获取连接,通过IO读取网页的源代码,用正则表达式筛选我们需要的代码,在每个筛选对象(图片的地址)前 ...

  2. java用爬虫爬一个页面_使用Java写一个简单爬虫爬取单页面

    使用Java爬虫爬取人民日报公众号页面图片 使用Java框架Jsoup和HttpClient实现,先看代码 爬取目标页面 1.使用Maven构建一个普通Java工程 加入依赖: org.jsoup j ...

  3. Java如何快速获取网站图片

    文章目录 前提 一.新建Maven项目,导入Jsoup环境依赖 二.代码编写 心得: 前提 最近我的的朋友浏览一些网站,看到好看的图片,问我有没有办法不用手动一张一张保存图片! 我说用Jsoup丫! ...

  4. 用 Java 实现爬虫 (爬取本地html中的人物信息并可视化人物关系)

    目录 爬虫简介 常用的工具框架 selenium + Jsoup Jsoup介绍 Jsoup的主要功能如下: HTML 相关知识 通过Jsoup元素获取 案例 爬取本地html中的角色信息 HtmlP ...

  5. java实现爬虫爬取京东手机页面

    java实现爬虫利用httpclient获取页面数据,再用jsoup解析获取数据,在此页面的分析不作过多赘述,读者自行分析. 1.首页输入手机,观察url参数,将其中"&page=& ...

  6. python3 爬虫神器pyquery的使用实例之爬网站图片

    PyQuery 可让你用 jQuery 的语法来对 xml 进行操作,这和 jQuery 十分类似.如果利用 lxml,pyquery 对 xml 和 html 的处理将更快. 如果对 jQuery  ...

  7. python爬虫爬网站数据登录_使用webdriver+urllib爬取网页数据(模拟登陆,过验证码)...

    urilib是python的标准库,当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得ur ...

  8. python爬网站图片教程_Python超简单的爬取网站中图片

    1.首先导入相关库 importrequestsimportbs4importthreading #用于多线程爬虫,爬取速度快,可以完成多页爬取import os 2.使用bs4获取html中的内容 ...

  9. java万能爬虫爬取拉勾网

    看的小匠实战课写的,嘿嘿.跟着敲一遍代码后总结一下. 1.selenium定义(百度的) Selenium(浏览器自动化测试框架) Selenium  是一个用于Web应用程序测试的工具.Seleni ...

最新文章

  1. 【django轻量级框架】云端系统之Django框架
  2. Python基础教程(七):函数、模块
  3. VTK:几何对象之Cell3DDemonstration
  4. #我要上首页# 新版博客首页来了,做明星博主还会远吗?
  5. 这些工具你利用好了吗?
  6. mybatis mysql selectkey_Mybatis示例之SelectKey的应用
  7. php 公众号验证回调方法_如何进行公众号文章收集 两种收集方法详解
  8. 使用php框架文件上传,Laravel框架文件上传功能实现方法示例
  9. java 去系统运行时间,JAVA WEB获取系统运行时间
  10. 持有数字货币的手机丢了,数字货币还能找回来吗?该注意些什么?
  11. AMD and CMD are dead之KMDjs内核之依赖分析
  12. 小巧的KML文件生成工具KML Generator
  13. ppt背景图片计算机教学知识,数学课件ppt背景图片
  14. python雨课堂答案_雨课堂和微助教的比较分析
  15. 我的人生观、爱情观和世界观
  16. 7-17 小红帽与大灰狼的故事
  17. 编译原理学习之:上下文无关文法(Context-free Grammar)和下推自动机(Push-down automata)
  18. 基于树莓派的手势识别Oled屏幕显示
  19. c语言说明函数的作用是,C语言中rewind函数的作用是什么?
  20. Ubuntu下如何获取usb相机的PID/VID并打开指定的相机

热门文章

  1. 戴尔服务器装w10系统,手把手告诉你戴尔Dell电脑台式如何重装win10系统!
  2. 关于3D可视化平台!
  3. 2022年熔化焊接与热切割理论题库及答案
  4. 工业废水在线监测系统
  5. Stellar Repair for MS SQL 10.0
  6. 三星折叠手机技术大获全胜,华为或放弃外向折叠
  7. 给自己找一个继续努力的理由!
  8. 基于卷积神经网络(CNN)的中文垃圾邮件检测
  9. 训练营感想_为什么训练营很有价值
  10. 绕过新手教程和开始动漫——钛备份的使用