利用正则表达式爬取网页图片 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("下载失败"); } } }