Java 抓取网页上的图片

本文介绍
1.利用正则 匹配到网页上的 图片的路径 和标题
2.然后下载
3.然后上传到服务器



public class Picture {

	private String title;
	private String source;
	private String upPath;
//get set ...
	
}




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.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.sun.xml.internal.fastinfoset.stax.events.Util;

public class CatchPicture {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//定义抓取图片的 正则表达式
		String regular="[*]<b>.*?</b><br/><img src=\"(.*?)\" border=0 alt=\'(.*?)\' style=\".*?\" class=\".*?\">
";
		List<Picture> list=new CatchPicture().lookWeiboPic("http://gaoxiao.jokeji.cn/GrapHtml/dongtai/20120921221658.htm","GBK",regular,"2,1");
		System.out.println(list.size());
	}
	//根据URL查看网站上的图片
	public List<Picture> lookWeiboPic(String url,String charset,String regular,String attIndex){
		List<Picture> list=new ArrayList<Picture>();
		try {
			//获取填写的url
			//判断所属网站 获取 正则表达式
			//获取图片存放到 list集合
			if(!Util.isEmptyString(url)){
					String htmls = getPageSource(url.trim(),charset);
					Pattern pattern =null;
					pattern = Pattern.compile(regular.trim());
					if(!Util.isEmptyString(htmls)){
						Matcher matcher = pattern.matcher(htmls);
						
						//得到参数属性顺序
						String[] sort = regular.trim().split(","); //下标:0 表示 标题title , 1 表示 图片路径 
						//判断后缀后 得到网站的请求头部 http://www.moonbasa.com/p-032111106.html-->得到 http://www.moonbasa.com
						String[] suffix;
						suffix =url.trim().split("cn");
						String httphread = "";
						if (suffix.length > 1) {
							httphread = suffix[0] + "cn";
	
						} else {
							suffix = url.trim().split("com");
							httphread = suffix[0] + "com";
						}
						//循环匹配找到的
						while(matcher.find()){
							Picture picture=new Picture();
							
							//匹配出title
							if (-1 == Integer.parseInt(sort[0])) {
								// 页面上抓不到标题
								picture.setTitle("");
							} else {
								// 去标题的#
								String title=matcher.group(Integer.parseInt(sort[0])).replace("#", " ");
								picture.setTitle(title);
							}
							
							//匹配出source
							if (-1 == Integer.parseInt(sort[1])) {
								// 页面上抓不到图片路径
								picture.setSource("");
							}else{
								String webImgUrl=matcher.group(Integer.parseInt(sort[1]));
								//判断是绝对路径还是相对路径
								String[] pathType=webImgUrl.split(":");
								if(pathType.length>1){
									//绝对路径
									picture.setSource(webImgUrl);
								}else{
									//判断相对路径是否含有..
									pathType=webImgUrl.split("\\.\\.");
									if(pathType.length>1){
										picture.setSource(httphread+pathType[1]);
									}else{
										if(webImgUrl.startsWith("/")){
											picture.setSource(httphread+pathType[0]);
										}else{
											picture.setSource(httphread+"/"+pathType[0]);
										}
									}
								}
							}
							String upPath=upload(picture.getSource(),"d:\\image\\");
							picture.setUpPath(upPath);
							list.add(picture);
						}//--end while
					}
		
				}
			}catch (Exception e) {
				e.printStackTrace();
			}
		return list;
	} 
	
	/**
	 * 根据网路路径获取 页面源码
	 * @param pageUrl
	 * @param encoding
	 * @return
	 */
	public String getPageSource(String pageUrl,String encoding) {    
    StringBuffer sb = new StringBuffer();    
    try {    
        //构建一URL对象    
        URL url = new URL(pageUrl);    
        //使用openStream得到一输入流并由此构造一个BufferedReader对象    
        BufferedReader in = new BufferedReader(new InputStreamReader(url    
                .openStream(), encoding));    
        String line;    
        //读取www资源    
        while ((line = in.readLine()) != null) {    
            sb.append(line);    
            sb.append("\n");  
        }    
        in.close();    
    } catch (Exception ex) {    
        System.err.println(ex);    
    }    
    return sb.toString();    
}   
	
	/**
	 * 上传 图片 
	 * @param urlStr
	 * @param path
	 * @return
	 * @throws Exception 
	 */
	public String upload(String urlStr,String path) throws Exception{
		Calendar calendar = Calendar.getInstance();
		String month = calendar.get(Calendar.YEAR) + "/"
				+ (calendar.get(Calendar.MONTH) + 1);
		String filename = java.util.UUID.randomUUID().toString()
				+ getExtension(urlStr);
		path =path + month + "/";
		download(urlStr,path,filename);
		return path+month + "/" + filename;
	}
	/**
	 * 根据路径 下载图片 然后 保存到对应的目录下
	 * @param urlString
	 * @param filename
	 * @param savePath
	 * @return
	 * @throws Exception
	 */
	public void download(String urlString, String filename,String savePath) throws Exception {
	    // 构造URL
	    URL url = new URL(urlString);
	    // 打开连接
	    URLConnection con = url.openConnection();
	    //设置请求的路径
	    con.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);
	    }
	    // 完毕,关闭所有链接
	    os.close();
	    
	    is.close();
	} 
	
/**
 * 根据文件名 获取文件的后缀名
 * @param fileUrl
 * @return
 */
 public String getExtension(String fileUrl){
	 return fileUrl.substring(fileUrl.lastIndexOf("."), fileUrl.length());
 }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VR(Virtual Reality)即虚拟现实,是一种可以创建和体验虚拟世界的计算机技术。它利用计算机生成一种模拟环境,是一种多源信息融合的、交互式的三维动态视景和实体行为的系统仿真,使用户沉浸到该环境中。VR技术通过模拟人的视觉、听觉、触觉等感觉器官功能,使人能够沉浸在计算机生成的虚拟境界中,并能够通过语言、手势等自然的方式与之进行实时交互,创建了一种适人化的多维信息空间。 VR技术具有以下主要特点: 沉浸感:用户感到作为主角存在于模拟环境中的真实程度。理想的模拟环境应该使用户难以分辨真假,使用户全身心地投入到计算机创建的三维虚拟环境中,该环境中的一切看上去是真的,听上去是真的,动起来是真的,甚至闻起来、尝起来等一切感觉都是真的,如同在现实世界中的感觉一样。 交互性:用户对模拟环境内物体的可操作程度和从环境得到反馈的自然程度(包括实时性)。例如,用户可以用手去直接抓取模拟环境中虚拟的物体,这时手有握着东西的感觉,并可以感觉物体的重量,视野中被的物体也能立刻随着手的移动而移动。 构想性:也称想象性,指用户沉浸在多维信息空间中,依靠自己的感知和认知能力获取知识,发挥主观能动性,寻求解答,形成新的概念。此概念不仅是指观念上或语言上的创意,而且可以是指对某些客观存在事物的创造性设想和安排。 VR技术可以应用于各个领域,如游戏、娱乐、教育、医疗、军事、房地产、工业仿真等。随着VR技术的不断发展,它正在改变人们的生活和工作方式,为人们带来全新的体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值