利用正则表达式爬取网页图片 java

正则表达式是一种非常强大的字符串处理工具。这篇博客主要是举一个正则表达式在运用中的例子——爬取网页图片

爬取网页图片思路:

         1.获取网页HTML内容

         2.用正则表达式来获取HTML中的URL

         3.用正则表达式获取URL中的Src(图片源码)

         4.连接Src下载文件

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
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;

public class CatchImg {
    static String url="你想爬取得网址";
    //匹配的Url正则
    static String url_reg="<img.*src=(.*?)[^>]*?>";
    //匹配Src的正则
    static String src_reg="[a-zA-z]+://[^\\s]*";
    
    public static void main(String[] args) throws Exception
    {
        //获取HTML内容
        String html=getHtml(url);
        //获取Url
        List<String> listUrl=getUrl(html);
        //获取Src
        List<String> listSrc=getSrc(listUrl);
        //下载到本地
        Download(listSrc);
    }
    public static String getHtml(String url) throws Exception
    {
        URL uri=new URL(url);
        URLConnection connection=uri.openConnection();
        InputStream in=connection.getInputStream();
        StringBuffer sb=new StringBuffer();
        byte[] buf=new byte[1024];
        int len=0;
        while((len=in.read(buf))!=-1)
        {
            //这个地方要注意,如果用BufferedReader按line读取的话,每行后面要加上append("/n")
            sb.append(new String(buf,0,len));
        }
        in.close();   
        return sb.toString();
    }
    public static List<String> getUrl(String html)
    {
        Matcher matcher=Pattern.compile(url_reg).matcher(html);
        List<String> listUrl=new ArrayList<String>();
        while(matcher.find())
        {
            listUrl.add(matcher.group());
        }
        return listUrl;
    }
    public static List<String> getSrc(List<String> listUrl )
    {
        List<String> listSrc=new ArrayList<String>();
        for(String temp:listUrl)
        {
            Matcher matcher=Pattern.compile(src_reg).matcher(temp);
            
            while(matcher.find())
            {
                //如果吧下面代码改成listSrc.add(matcher.group()),因为下面代码是把最后一个字符去掉的
                listSrc.add(matcher.group().substring(0,matcher.group().length() - 1));    
            }
        }
        
        return listSrc;
    }

    private static void Download(List<String> listImgSrc) {  
        int count=0;
        try {  
            for (String url : listImgSrc) 
            {  
                String imageName = count+".JPG";  
                URL uri = new URL(url);  
                InputStream in = uri.openStream();  
                FileOutputStream fo = new FileOutputStream(new File(imageName));// 文件输出流  
                byte[] buf = new byte[1024];  
                int length = 0;  
                System.out.println("开始下载:" + url);  
                while ((length = in.read(buf)) != -1) {  
                    fo.write(buf, 0, length);  
                }  
   
                in.close();  
                fo.close();  
                System.out.println(imageName + "下载完成");  
                
                count++;
            }  
           
        } catch (Exception e) {  
            System.out.println("下载失败");  
        }  
    }  
    
}

 

posted on 2018-06-20 16:24  yfyfyf947  阅读(659)  评论(0编辑  收藏  举报