为了使博客更美观,有时候需要一些好看的图片,用java写一个比较简单的爬虫。

一、分析花瓣网的网络请求。

我选择的是一个花瓣网的一个标签素材,url地址为:http://huabanpro.com/boards/19789984/

这个页面的加载方式为瀑布流加载,使用了ajax异步加载,下拉页面在新产生的请求中找到分页请求,

使用java爬取花瓣网图片-明亮

二、验证url

直接访问这个url发现加载的图片就是下拉的时候新加载的图片,然后修改limit参数发现页面图片数量也跟着变化了,确定url没问题后,废话不多说,直接上代码

三、代码

package net.limingliang.www;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
	 // 地址
    private static final String URL = "http://huabanpro.com/boards/19789984/?jseb6930&max=1400289591&limit=100&wfl=1";
    // 获取img标签正则
    private static final String IMGURL_REG = "<img.*?src=[\'\"](.*?)[\'\"](.*?).*?>";
    // 获取src路径的正则  img格式:<img src="//hbimg.b0.upaiyun.com/dd2bd4353d45b151b6198443596d5e7413e49f1d4e670-4EnFW5_fw236" width="236" height="420" alt="逆光の舞者采集到「记忆斑驳の旧时光」" data-baiduimageplus-ignore="1"/>
    private static final String IMGSRC_REG = "\"//hbimg.b0.upaiyun.com/.*?\".*?";

    public static void main(String[] args) {
        try {
        	
            Test cm=new Test();
            //获得html文本内容
            String HTML = cm.getHtml(URL);
            //获取图片标签
            List<String> imgUrl = cm.getImageUrl(HTML);
            //获取图片src地址
            List<String> imgSrc = cm.getImageSrc(imgUrl);
            //下载图片
            cm.Download(imgSrc);

        }catch (Exception e){
            System.out.println("发生错误");
        }

    }

   //获取HTML内容
    private String getHtml(String url)throws Exception{
        URL url1=new URL(url);
        URLConnection connection=url1.openConnection();
        InputStream in=connection.getInputStream();
        InputStreamReader isr=new InputStreamReader(in);
        BufferedReader br=new BufferedReader(isr);

        String line;
        StringBuffer sb=new StringBuffer();
        while((line=br.readLine())!=null){
            sb.append(line,0,line.length());
            sb.append('\n');
        }
        br.close();
        isr.close();
        in.close();
        System.out.println(sb.toString());
        return sb.toString();
    }

    //获取ImageUrl地址
    private List<String> getImageUrl(String html){
        Matcher matcher=Pattern.compile(IMGURL_REG).matcher(html);
        List<String>listimgurl=new ArrayList<String>();
        while (matcher.find()){
        		System.out.println(matcher.group());
            listimgurl.add(matcher.group());
        }
        return listimgurl;
    }

    //获取ImageSrc地址
    private List<String> getImageSrc(List<String> listimageurl){
        List<String> listImageSrc=new ArrayList<String>();
        for (String image:listimageurl){
	        	if(image.contains("width")) {
	        		Matcher matcher=Pattern.compile(IMGSRC_REG).matcher(image);
	        		while (matcher.find()){
	        			//发现采集到的img url为hbimg.b0.upaiyun.com/图片id_fw236
	        			//然后发现hbimg.b0.upaiyun.com/图片id_fw236需要修改为hbimg.b0.upaiyun.com/图片id_/fw/236才能正常抓到图片
	        			//最后的数字应该为分辨率,修改为高的分辨率
	        			System.out.println("http://"+matcher.group().substring(3, matcher.group().length()-6)+"/fw/480");
	                                listImageSrc.add("http://"+matcher.group().substring(3, matcher.group().length()-6)+"/fw/480");
	            }
	        	}
        }
        return listImageSrc;
    }

    //下载图片
    private void Download(List<String> listImgSrc) {
        try {
            //开始时间
            Date begindate = new Date();
            for (String url : listImgSrc) {
                //开始时间
                Date begindate2 = new Date();
                String imageName = url.substring(url.indexOf(".com") + 5, url.length()-8);
                URL uri = new URL(url);
                InputStream in = uri.openStream();
                FileOutputStream fo = new FileOutputStream(new File("/Users/limingliang/Downloads/huaban/"+imageName+".jpg"));
                byte[] buf = new byte[1024];
                int length = 0;
                System.out.println("开始下载:" + url);
                while ((length = in.read(buf, 0, buf.length)) != -1) {
                    fo.write(buf, 0, length);
                }
                in.close();
                fo.close();
                System.out.println(imageName + "下载完成");
                //结束时间
                Date overdate2 = new Date();
                double time = overdate2.getTime() - begindate2.getTime();
                System.out.println("耗时:" + time / 1000 + "s");
            }
            Date overdate = new Date();
            double time = overdate.getTime() - begindate.getTime();
            System.out.println("下载文件数:"+listImgSrc.size()+",总耗时:" + time / 1000 + "s");
        } catch (Exception e) {
        		e.printStackTrace();
            System.out.println("下载失败");
        }
    }
}

四、查看抓取的图片

使用java爬取花瓣网图片-明亮