1.学习目的:熟悉java类集以及IO流操作,为图片识别做采集铺垫
2.对象网站:http://www.ivsky.com
3.制作思路: 1. 输入一个网址,获取该网址的html内容.
2. 分析html内容,提取到所有网址和图片地址
3. 如果是遍历网址就循环对每个网址重复做步骤一和步骤2,如果是图片,就下载图片。(所有方法都做函数封装)

没做界面,就一个简单的控制台程序(输入数字即可运行),效果图如下:

源代码和源文件(在最下面)如下:

1.SpiderHelp.java文件(封装各个函数)

package spider;import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class SpiderHelp {static int cou=0;//记图片的数量/*** 下载功能* * @param urlString* @param filename* @param savePath* @throws Exception*/public static void download(String urlString, String filename, String savePath) {try {// 构造URLURL url = new URL(urlString);// 打开连接URLConnection con = url.openConnection();// 设置请求超时为5scon.setConnectTimeout(5 * 1000);// 输入流InputStream is = con.getInputStream();// 1K的数据缓冲byte[] bs = new byte[1024];// 读取到的数据长度int len;// 输出的文件流File sf = new File(savePath);if (!sf.exists()) {sf.mkdirs();}OutputStream os = new FileOutputStream(sf.getPath() + "\\" + filename);// 开始读取while ((len = is.read(bs)) != -1) {os.write(bs, 0, len);}} catch (Exception e) {// TODO: handle exception} finally {}}/*** 传入一个网址字符串返回网页的html内容* * @param webSite* @return String* @throws Exception*/public static String getWebConcent(String webSite) {try {// 定义即将访问的链接String url = webSite;// 定义一个字符串用来存储网页内容String result = "";// 定义一个缓冲字符输入流BufferedReader in = null;// 将url的string字符串转成url对象URL realUrl = new URL(url);// 初始化一个连接到那个URL链接URLConnection connection = realUrl.openConnection();// 开始实际连接connection.connect();// 初始化BufferedReader输入流来读取URL的响应并指定字符串编码为UTF-8in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));// 用来临时存储抓取到每一行的数据String line;while ((line = in.readLine()) != null) {// 遍历抓取到的每一行并将其存储到result里面result += line;}// TODO: handle exceptionin.close();// System.out.println(result);return result;} catch (Exception e) {// TODO: handle exception}return "";}/*** 输入字符串和正则匹配字符,返回分割的字符* * @param regex* @param str* @return String*/public static String splitStringOne(String regex, String str) {try {Pattern pattern = Pattern.compile(regex); // 定义一个模版Matcher matcher = pattern.matcher(str);// 定义一个匹配类String str1 = new String();if (matcher.find()) { // 开始搜索匹配的字符串str1 = matcher.group(0);// 将匹配的字符串赋给str1} else {str1 = "";}return str1;// 返回字符串} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return "";// 返回字符串}/*** 输入字符串和正则匹配字符,返回分割字符是否成功* * @param regex* @param str* @return String*/public static boolean splitStringOneWithJudge(String regex, StringBuffer strBuf) {Pattern pattern = Pattern.compile(regex); // 定义一个模版Matcher matcher = pattern.matcher(strBuf);// String str1 = new String();if (matcher.find()) {String str1 = matcher.group(0);int strBufLength = strBuf.length();strBuf.replace(0, strBufLength, "");strBuf.append(str1);return true;}return false;}/*** 传入一个网址字符串返回分割好的字符串数组* * @param webSite* @return String* @throws Exception*/public static String[] splitStringMany(String regex, String str) {if (!("".equals(str))) {Pattern pattern = Pattern.compile(regex); // 定义一个模版Matcher matcher = pattern.matcher(str);String[] str1 = new String[0];// str1=str.split(regex, 20);while (matcher.find()) {String[] cloned = new String[str1.length + 1];System.arraycopy(str1, 0, cloned, 0, cloned.length - 1);cloned[cloned.length - 1] = matcher.group();str1 = cloned;}// for ( String string2 : str1 )// {// System.out.println (string2);// }return str1;} else {return null;}}/*** 截取字符串数组中的字符,并返回字符串数组* * @param regex* @param str* @return 字符串数组*/public static String[] splitStringMany(String regex, String str[]) {// 遍历str[]数组中的每一个元素,根据正则表达式分割for (int i = 0; i < str.length; i++) {str[i] = splitStringOne(regex, str[i]);}return str;}/*** 对图片天堂网一个进行下载图片网址* * @throws Exception* */public static void imgDownloadToHeavenWeb(String url) {try {String regex = "<img.*?>";// 定义获取img标签的正则表达式String[] str1 = null;// 定义接收img标签的数组SpiderHelp spiHel = new SpiderHelp();// 实例化SpiderHelp类// String str =// spiHel.getWebConcent("http://www.ivsky.com/tupian/ziranfengguang/");//// 获取该网站的数据String str = spiHel.getWebConcent(url);System.out.println("原始数据为" + str);// 输出原始数据System.out.println("==================");str1 = spiHel.splitStringMany(regex, str); // 对数据进行分割并将数据保存在数组里面for (int i = 0; i < str1.length; i++) { // 输出第一次提取的数据System.out.println("第" + i + "条数据为" + str1[i]);}System.out.println("==================");str1 = spiHel.splitStringMany("src=\".*?\"", str1);// 在对数据进行第二次提取for (int i = 0; i < str1.length; i++) {System.out.println("第" + i + "条数据为" + str1[i]);}System.out.println("==================");str1 = spiHel.splitStringMany("http.+jpg", str1);// 在对数据进行第二次提取for (int i = 0; i < str1.length; i++) {System.out.println("第" + i + "条数据为" + str1[i]);}System.out.println("==================");// 下载图片测试for (int i = 0; i < str1.length; i++) {String s = getPresentTime() + "第" + cou++ + "张图片.jpg"; // 定义每一张图片名字并设置后缀名if (!("".equals(str1[i]))) {System.out.println("第" + cou + "张图片正在下载");spiHel.download(str1[i], s, "d:\\image\\");// 遍历网址并下载图片}System.out.println("==================");}} catch (Exception e) {// TODO: handle exception}}/*** 对图片天堂网的网址进行分割,如果与原网址相等则返回空* * @return*/public static String[] htmlDivisionToHeavenWeb(String url) throws Exception {SpiderHelp spiHel = new SpiderHelp();// 实例化SpiderHelp类String[] str1 = null;// 定义接收img标签的数组String str = spiHel.getWebConcent(url);// 测试对网址的提取str1 = spiHel.splitStringMany("<a.*?>", str); // 对数据进行第一次分割并将数据保存在数组里面if (str1 != null) {for (int i = 0; i < str1.length; i++) {System.out.println("第" + i + "条数据为" + str1[i]);}System.out.println("==================");str1 = spiHel.splitStringMany("href=[\'\"].*?[\'\"]", str); // 对数据进行第二次分割并将数据保存在数组里面for (int i = 0; i < str1.length; i++) {System.out.println("第" + i + "条数据为" + str1[i]);}System.out.println("==================");str1 = spiHel.splitStringMany("/.*/", str1); // 对数据进行第三次分割并将数据保存在数组里面for (int i = 0; i < str1.length; i++) {if ("".equals(str1[i])) {str1[i] = "";} else if ("/".equals(str1[i])) {str1[i] = "";} else if ("//".equals(str1[i])) {str1[i] = "";} else {str1[i] = "http://www.ivsky.com" + str1[i];System.out.println("第" + i + "条数据为" + str1[i]);}}return str1;} elsereturn null;}/*** 对图片天堂网的网址进行分割,如果与原网址相等则返回空,只返回网址* * @return*/public static String[] htmlDivisionToHeavenOnly(String url) throws Exception {if("".equals(url)){return null;}else{SpiderHelp spiHel = new SpiderHelp();// 实例化SpiderHelp类String[] str1 = null;// 定义接收img标签的数组String str = spiHel.getWebConcent(url);// 测试对网址的提取str1 = spiHel.splitStringMany("<a.*?>", str); // 对数据进行第一次分割并将数据保存在数组里面if (str1 != null) {// for (int i = 0; i < str1.length; i++) {// System.out.println("第" + i + "条数据为" + str1[i]);// }// System.out.println("==================");str1 = spiHel.splitStringMany("href=[\'\"].*?[\'\"]", str); // 对数据进行第二次分割并将数据保存在数组里面// for (int i = 0; i < str1.length; i++) {// System.out.println("第" + i + "条数据为" + str1[i]);// }// System.out.println("==================");str1 = spiHel.splitStringMany("/.*/", str1); // 对数据进行第三次分割并将数据保存在数组里面for (int i = 0; i < str1.length; i++) {if ("".equals(str1[i])) {str1[i] = "";} else if ("/".equals(str1[i])) {str1[i] = "";} else if ("//".equals(str1[i])) {str1[i] = "";} else if ("/img/".equals(str1[i])) {str1[i] = "";} else {str1[i] = "http://www.ivsky.com" + str1[i];System.out.println("第" + i + "条数据为" + str1[i]);}}return str1;} elsereturn null;}}/*** 获取当前系统时间并返回自定义格式* * @return*/public static String getPresentTime() {Calendar calendar = new GregorianCalendar();StringBuffer strBuf = new StringBuffer();strBuf.append(calendar.get(Calendar.YEAR) + "年");strBuf.append(calendar.get(Calendar.MONTH) + "月");strBuf.append(calendar.get(Calendar.DAY_OF_MONTH) + "日");strBuf.append(calendar.get(Calendar.HOUR_OF_DAY) + "时");strBuf.append(calendar.get(Calendar.MINUTE) + "分");strBuf.append(calendar.get(Calendar.SECOND) + "秒");strBuf.append(calendar.get(Calendar.MILLISECOND) + "毫秒");String str = strBuf.toString();// 将时间转化为字符串return str;}/*** 对全景网一个进行下载图片网址* * @throws Exception* */public static void imgDownloadToanoramaWeb(String url, int number) {try {SpiderHelp spiHel = new SpiderHelp();// 实例化SpiderHelp类// 获取该网站的数据// 下载图片测试for (int i = 0; i < number; i++) {String s = getPresentTime() + "第" + i + "张验证码.gif"; // 定义每一张图片名字并设置后缀名System.out.println("第" + i + "张验证码正在下载");spiHel.download(url, s, "d:\\image\\VerificationCode\\");// 遍历网址并下载图片System.out.println("==================");}} catch (Exception e) {// TODO: handle exception}}
}

2.主函数(程序运行入口)Main.java

package spider;import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.*;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;import javax.swing.SpinnerListModel;
import com.spider.web.model.*;public class Main {public static void main(String[] args) throws Exception {SpiderHelp spiHel = new SpiderHelp();// 实例化SpiderHelp类// spiHel.imgDownloadToHeavenWeb("http://www.ivsky.com/tupian/banshanbandao_v24024/");// SpiderWeb spiWeb=new SpiderWeb();// WebNode node=new WebNode("http://www.ivsky.com/");// spiWeb.buildSpiderWebTwoLayer(node);// 遍历测试int n ;System.out.println("0.输入0表示遍历天堂图片网");System.out.println("1.输入1表示下载图片到D盘下image文件夹");System.out.println("2.输入2表示下载验证码到D盘image文件夹下的子文件夹");System.out.println("请输入0或者1或者2");Scanner scan =new Scanner(System.in);n=scan.nextInt();switch (n) {case 0: { // 遍历网站int count = 0;System.out.println("==========================================第一次遍历的网站=============================================");String str[] = spiHel.htmlDivisionToHeavenOnly("http://www.ivsky.com/");// 开始下载该网址的图片String str1[] = null;System.out.println("==========================================第二次遍历的网站=============================================");for (int i = 0; i < str.length; i++) {System.out.println("==========================================第二层第" + i+ "次遍历的网站=============================================");str1 = spiHel.htmlDivisionToHeavenOnly(str[i]);if (str1 != null && str1.length != 0) {for (int j = 0; j < str1.length; j++) {System.out.println("==========================================第三层第" + count+++ "次读取网址=============================================");if (!("".equals(str1[j]))) {spiHel.htmlDivisionToHeavenOnly(str1[j]);}}}}};case 1: { // 下载图片String str2[] = spiHel.htmlDivisionToHeavenWeb("http://www.ivsky.com/tupian/chengshilvyou/");// 开始下载该网址的图片if (str2 != null) { // 循环下载图片for (int i = 0; i < str2.length; i++) {if (!("".equals(str2[i]))) {spiHel.imgDownloadToHeavenWeb(str2[i]);}}}}break;case 2: { // 下载验证码spiHel.imgDownloadToanoramaWeb("http://www.quanjing.com/createImg.aspx", 200);// 下载验证码}break;case 3: {}break;default:break;}}
}

3.爬虫遍历算法没写完,后面再上传
4.源代码下载地址如下
Spider.rar链接:http://pan.baidu.com/s/1kVge1KF 密码:syua
Spider.exe链接(运行即可看到效果):
链接:http://pan.baidu.com/s/1pLHjVWf 密码:amxu

简单的图片采集器(网络爬虫原理)相关推荐

  1. 【易语言】易语言制作-bt天堂ok资源采集器(网络爬虫)

    .版本 2 .支持库 spec.程序集 程序集1.子程序 _启动子程序, 整数型, , 本子程序在程序启动后最先执行 .局部变量 i, 整数型 .局部变量 源代码, 文本型 .局部变量 详细页地址, ...

  2. 利用PHP制作简单的内容采集器的原理分析

    利用PHP制作简单的内容采集器的原理分析 2008-12-12 11:24 前几天做了个小说连载的程序,因为怕更新麻烦,顺带就写了个采集器,采集八路中文网的,功能比较简单,不能自定义规则,不过大概思路 ...

  3. 美女图片采集器 源码+解析

    前言: 有一段时间没写博客了, "持之以恒"徽章都暗了, 实在不该. 前一段确实比较忙, ...小小地给自己的懒找个借口吧. 大二即将结束, 学习iOS也有一段时间了.今天抽点时间 ...

  4. 美女图片采集器 (源码+解析)

    前言: 有一段时间没写博客了, "持之以恒"徽章都暗了, 实在不该. 前一段确实比较忙, ...小小地给自己的懒找个借口吧. 大二即将结束, 学习iOS也有一段时间了.今天抽点时间 ...

  5. 网络爬虫原理(概要了解)

    一.网络爬虫原理 1.1 等同于浏览器访问网页的原理 (1)真人行为驱动 (2)浏览器自动执行人为的动作,即将动作自动程序化. 1.2 网络爬虫就是将浏览器访问网页的过程,再次抽像成程序. 二.网络爬 ...

  6. 图片采集器-网页图片批量采集器免费

    图片采集器可以采集网站上的各种图片,每个人都可以采集到各种高清图源.支持任意格式的图片采集,只需要导入链接即可批量采集图片.还有更多的采集方式:输入关键词全网图片采集/任意网站所有图片采集!不仅可以采 ...

  7. 最简单的免费采集器——易数云

    最简单的免费采集器--易数云采集器 为什么说易数云采集器简单呢?这个采集器已经包含有大量的采集规则,对于小白来说简直是轻松上手而且当前采集器还属于迭代中客服非常的认证几乎达到一对一服务,当前采集器拥有 ...

  8. 利用PHP制作简单的内容采集器

    利用PHP制作简单的内容采集器 作者:yzxh24    阅读人次:--    文章来源:天极论坛整理    发布时间:2018/4/23    网友评论()条   采集器,通常又叫小偷程序,主要是用 ...

  9. Java网络爬虫入门:第01课:网络爬虫原理

    引言 随着互联网的迅速发展,网络资源越来越丰富,信息需求者如何从网络中抽取信息变得至关重要.目前,有效的获取网络数据资源的重要方式,便是网络爬虫技术.简单的理解,比如您对百度贴吧的一个帖子内容特别感兴 ...

最新文章

  1. 机器学习数据预处理之缺失值:中位数填充
  2. 第十七届第一场智能车竞速校内赛,比往年来的早一些
  3. Linux Shell变量类型
  4. 驱动人生2008_驱动人生致敬深圳经济特区建立四十周年!
  5. python大作业爬虫_爬虫大作业
  6. go语言和java比_Go VS Java:一位资深程序员对两种语言的解读
  7. 智慧讲台接收画板协议规划
  8. 零基础web前端学习之JavaScript 和css 阻塞
  9. 安装完VS2010之后再安装VS2012以后,发现VS工程编译出现--fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
  10. 74 岁的柳传志和 34 岁的联想
  11. 有关冒泡排序法的问题
  12. 安装vmware-tools遇the path is not valid path to the gcc binary和the path is not a valid path to th...
  13. 一款用C++语言实现的3D游戏引擎(附源码),适用于想学3D游戏开发
  14. 移动端UML图应用之UML图简述
  15. 算法设计——荷马史诗(K叉哈夫曼 贪心)
  16. 用iSee图片专家制作淘宝店标教程
  17. mermaid流程图工具_基于 Mermaid 的时序图、流程图和甘特图
  18. 你真的了解单点登录(SSO)吗? 单点登录实现方式
  19. 知乎社区平台分析报告
  20. 第十章、正则表达式和JSON

热门文章

  1. 8051单片机实战分析(以STC89C52RC为例) | 09 - LED点阵显示数字
  2. dedec教程:修改织梦Dedecms跳转提示信息的方法
  3. MySQL千万级数据进行插入,基础数据3千万,插入1千万数据时间约为4.7分钟,10个线程同时插入
  4. 【手游服务端】仙梦奇缘一键端服务端
  5. Word 中Grammarly插件不能显示修改建议侧边栏
  6. 某空姐写的飞机上名人印象
  7. 【机器人学】平面2R机器人(五)——逆动力学
  8. 通过JDBC连接Oracle数据库时进行查询操作时产生BigDecimal转换异常的处理
  9. 炒股第三招【比价技巧】
  10. use potato