A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵兵锋 中级黑马   /  2012-6-11 01:58  /  2050 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

自己折腾的图片下载器,会查找二层链接里的图片,类似于图片整站下载的简易版。
  1. import java.awt.image.BufferedImage;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.io.InputStreamReader;
  9. import java.net.MalformedURLException;
  10. import java.net.URL;
  11. import java.util.ArrayList;
  12. import java.util.regex.Matcher;
  13. import java.util.regex.Pattern;

  14. import javax.imageio.ImageIO;

  15. public class DownloadPic
  16. {
  17.         private static final String startUrl = "http://www.baidu.com/";//起始地址
  18.         private static final String  filePath= "E:/downPic";//文件存放路径
  19.         public static void main(String[] args)
  20.         {
  21.                 start(startUrl,0);//开始搜索
  22.         }
  23.         static void start(String source,int count)//这里的count参数是为了以后程序功能扩展
  24.         {
  25.                 ArrayList<String> list = new ArrayList<String>();//用来装链接地址
  26.                 int t= count;
  27.                 list.add(source);
  28.                 try {
  29.                         URL url = new URL(source);
  30.                         BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
  31.                         File file_dir = new File(filePath);//图片的存放目录
  32.                         if(!file_dir.exists())
  33.                                 file_dir.mkdir();
  34.                         file_dir = null;
  35.                         FileOutputStream file = new FileOutputStream(new File(filePath+"/t"+t+".txt"));//起始地址读出的数据
  36.                         String str;
  37.                         while((str=in.readLine())!=null)
  38.                         {
  39.                                 file.write(str.getBytes());
  40.                         }
  41.                         in.close();
  42.                         file.close();
  43.                 } catch (Exception e) {
  44.                         e.printStackTrace();
  45.                 }
  46.                 String ps2 = "href=\"([^\"]+)\"";//指定获取网页代码里中引号内的内容即地址
  47.                 Pattern p=Pattern.compile(ps2);
  48.                 Matcher m;
  49.                 String ss="";
  50.                 BufferedImage img;
  51.                 try {//将首页的代码取出
  52.                         FileInputStream file = new FileInputStream(new File(filePath+"/t"+t+".txt"));
  53.                         BufferedReader in = new BufferedReader(new InputStreamReader(file));
  54.                         String str;
  55.                         while((str=in.readLine())!=null)
  56.                         {
  57.                                 ss=ss.concat(str);
  58.                         }
  59.                         in.close();
  60.                 } catch (FileNotFoundException e) {
  61.                         e.printStackTrace();
  62.                 } catch (IOException e) {
  63.                         e.printStackTrace();
  64.                 }
  65.                 m =p.matcher(ss);//开始解析首页中的地址
  66.                 while(m.find())
  67.                 {
  68.                         String temp = m.group().substring(6,m.group().length()-1);//取出中的http://www.baidu.com
  69.                         if(temp.endsWith(".css")||temp.endsWith(".js")||temp.endsWith(".jsp")||temp.equals("/"))
  70.                                 continue;//如果地址以css、js、jsp、/结尾就继续下一个地址的查找,因为这些类型的地址取不到图片
  71.                         try {
  72.                                 new URL(temp);
  73.                                 System.out.println(temp);
  74.                                 if(list.contains((String)temp))//防止装入重复地址
  75.                                                 continue;
  76.                                 list.add(temp);
  77.                         } catch (MalformedURLException e) {//URL格式错误,因为有的地址用的是相对地址,如href="help.html"
  78.                                 int i = source.lastIndexOf("/");
  79.                                 try {
  80.                                         new URL(source.substring(0,i+1)+temp);//根据起始地址,找出父路径,再与相对路径拼接.如http://www.baidu.com/help.html
  81.                                         if(list.contains((String)source.substring(0,i+1)+temp))//能执行到这里说明上一句不报异常,即说明新地址格式正确
  82.                                                 continue;
  83.                                         list.add(source.substring(0,i+1)+temp);//将新地址装进list中
  84.                                         System.out.println(source.substring(0,i+1)+temp);
  85.                                 } catch (MalformedURLException e1) {
  86.                                         continue;
  87.                                 }
  88.                         }               
  89.                 }
  90.                 for(int i =0;i<list.size();i++)//遍历list中的网页,找出其中的图片
  91.                 {
  92.                         fun(list.get(i),i);//i是此网页编号
  93.                 }
  94.         }
  95.         static void fun(String source,int count)
  96.         {
  97.                 ArrayList<String> list = new ArrayList<String>();
  98.                 try {//将此网页源代码存储到文本
  99.                         URL url = new URL(source);
  100.                         BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
  101.                         FileOutputStream file = new FileOutputStream(new File(filePath+"/t"+count+".txt"));
  102.                         String str;
  103.                         while((str=in.readLine())!=null)
  104.                         {
  105.                                 file.write(str.getBytes());
  106.                         }
  107.                         in.close();
  108.                         file.close();
  109.                 } catch (Exception e) {
  110.                         return;
  111.                 }
  112.                 String ps = "src=\"([^\"]+)\"|src=\'([^\']+)\'";//找到当前网页中所有src="..."或src='...'格式的字符串
  113.                 Pattern p=Pattern.compile(ps);
  114.                 Matcher m;
  115.                 String ss="";
  116.                 BufferedImage img;
  117.                 try {
  118.                         FileInputStream file = new FileInputStream(new File(filePath+"/t"+count+".txt"));//这个文件里存储着当前网页的源代码
  119.                         BufferedReader in = new BufferedReader(new InputStreamReader(file));
  120.                         String str;
  121.                         while((str=in.readLine())!=null)
  122.                         {
  123.                                 ss=ss.concat(str);
  124.                         }
  125.                 } catch (Exception e) {
  126.                         return;
  127.                 }
  128.                 m =p.matcher(ss);
  129.                 while(m.find())
  130.                 {
  131.                         String temp = m.group().substring(5,m.group().length()-1);//从src="http://www.baidu.com/banner.jpg"提取出引号内的地址
  132.                         if(temp.endsWith(".gif"))//找到gif图片
  133.                         {
  134.                                 if(list.contains(temp))//刚解析的图片地址早已经早list中存在,重复了,继续下一个地址
  135.                                         continue;
  136.                                 list.add(temp);
  137.                                 try {
  138.                                         img = ImageIO.read(new URL(temp));//将图片文件存储到本地
  139.                                         if(img!=null)
  140.                                         {System.out.println(temp);
  141.                                         File file = new File(filePath+"/"+temp.substring(temp.lastIndexOf("/")));//文件以图片在地址中的名字命名
  142.                                         ImageIO.write(img, "GIF",file);
  143.                                         }
  144.                                 } catch (MalformedURLException e) {//这一张图片存储失败,放弃,继续下一张
  145.                                         continue;
  146.                                 } catch (IOException e) {
  147.                                         continue;
  148.                                 }
  149.                                
  150.                         }
  151.                         else if(temp.endsWith(".jpg")||temp.endsWith(".jpeg"))//找到jpg\jpeg图片
  152.                         {
  153.                                 if(list.contains(temp))
  154.                                         continue;
  155.                                 list.add(temp);
  156.                                 try {
  157.                                         img = ImageIO.read(new URL(temp));
  158.                                        
  159.                                         if(img!=null)
  160.                                         {System.out.println(temp);
  161.                                         File file = new File(filePath+"/"+temp.substring(temp.lastIndexOf("/")));
  162.                                         ImageIO.write(img, "JPG",file);
  163.                                         }
  164.                                 } catch (MalformedURLException e) {
  165.                                         continue;
  166.                                 } catch (IOException e) {
  167.                                         continue;
  168.                                 }
  169.                         }
  170.                 }
  171.         }       
  172. }
  173. //思路:用url.openStream()获得起始地址的输入流,进而将地址里的数据存储到本地文件里,接着用正则表达式在文件里寻找这类的href链接地址,同样取出其中数据并存储到本地文件
  174. //接下来在本地存储的网页html代码里用正则表达式寻找src="http://www.baidu.com/banner.jpg"这类的src地址,将以图片类型结尾的地址里的数据取回,在本地存储为图片文件。
  175. //作用:假如给定起始地址为http://www.baidu.com/,在该页面及该页面使用href链接到的页面中的jpg\jpeg\gif图片保存到本地。
  176. //此程序只找了两层链接,通过将start方法扩展,可实现多层链接查找
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

1 个回复

倒序浏览
不错,兄弟写的代码不错,实现了二层连接里的图片下载,只是在代码的设计方面有点不太好,比如说通篇的代码只有两个static函数,应该把实现不同功能的代码封装到不同的方法中,以便于重用,比如说那个ArrayList 就可以定义为全局变量,这样就节省点内存。个人之见,仅供参考

评分

参与人数 1黑马币 +20 收起 理由
黄奕豪 + 20 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马