您的位置:首页 > 理论基础 > 计算机网络

网络爬虫:抓取页面图片

2015-03-05 11:56 369 查看
          爬虫就是根据页面的url来抓取页面的一些信息也就是页面的html代码,抓到后可以根据正则去匹配想要的片段,比如想要某一个页面中的一个图片,那么这个图片一定有自己的URL地址,可以正则匹配到这个url 在进行图片下载,也有很多人先写正则,根据正则的规则抓取页面的信息,当然这都是一种方式,根据业务需求去量身定做就好了,其实这两种方式各有好处,第一中适用于页面不会变化的,在代码里面写正则还是容易很多,第二种适用于页面经常改变的那么将正则放到数据库里面就可以了,以后页面变了直接改数据库而不是去该代码还要重新启动服务对吧!下面我举个小例子吧

   第一步:要有一个工具类,可以根据给定的URL地址去链接页面,在读取页面中的信息,当然java的.net包早已经提供了这种功能(也可以用更好的HttpClient)

                   就抓取搜库排行榜的 神雕侠侣的详情页吧 地址:rul=http://www.soku.com/v?keyword=%E7%A5%9E%E9%9B%95%E4%BE%A0%E4%BE%A3

/**

 *

 * @author 奇

 *

 * 2015-3-5

 */

public class ReptileUtil {

    public static String getHtmlData(String path) { //传入的页面地址 url

        StringBuffer sb = new StringBuffer();

        try {

            URL url = new URL(path);

            BufferedReader br = new BufferedReader(new InputStreamReader(

                    url.openStream(), Charset.forName("GBK")));//编码格式根据页面去定

            String s = null;

            while ((s = br.readLine()) != null) {

                sb.append(s);

            }

            br.close();

        } catch (Exception e) {

            e.printStackTrace();

        }

        return sb.toString(); //返回页面的html 信息

    }

    //根据给定的图片rul地址抓取图片并且下载到指定路径下

   public  File downLoadImage(String url) {

        String fileName = getUUID()+"_default."+"jpg";   //图片名称又uuid和字符串拼接而成 后缀默认是jpg的图片格式

        File file=null;

        byte[] btImg = getImageFromNetByUrl(url); //调用下面的方法返回读取的字节

        if (null != btImg && btImg.length > 0) {

          file=    writeImageToDisk(btImg, fileName);

        }

        return file;

    }

    public static byte[] getImageFromNetByUrl(String strUrl) {

        try {

            URL url = new URL(strUrl);

            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            conn.setRequestMethod("GET");

            conn.setConnectTimeout(5 * 1000);

            InputStream inStream = conn.getInputStream();// 通过输入流获取图片数据

            byte[] btImg = readInputStream(inStream);// 得到图片的二进制数据

            return btImg;

        } catch (Exception e) {

            e.printStackTrace();

        }

        return null;

    }

    public static byte[] readInputStream(InputStream inStream) throws Exception {

        ByteArrayOutputStream outStream = new ByteArrayOutputStream();

        byte[] buffer = new byte[1024];

        int len = 0;

        while ((len = inStream.read(buffer)) != -1) {

            outStream.write(buffer, 0, len);

        }

        inStream.close();

        return outStream.toByteArray();

    }

    public static File writeImageToDisk(byte[] img, String fileName) {

        File file = new File(TennisConfig.FILE_TEMP_PATH + fileName);//指定文件要下载的 位置 这里用配置文件读取了,可以自己定义

        try {

            FileOutputStream fops = new FileOutputStream(file);

            fops.write(img);

            fops.flush();

            fops.close();

        } catch (Exception e) {

            e.printStackTrace();

        }

        return file;

    }

    public static String getUUID() {//获取一个不从复的数来设置文件名,当然也可以用日期看自己喜好

        String s = UUID.randomUUID().toString();

        // 去掉“-”符号

        return s.substring(0, 8) + s.substring(9, 13) + s.substring(14, 18)

                + s.substring(19, 23) + s.substring(24);

    }
 }

 好了一个工具类已经完成包括从一个页面读取页面信息的方法和根据图片地址下载图片的方法都已经完成       

   public class grab{

    / /根据页面html的格式找到图片所在的div 写正则 匹配出图片的rul地址 如下:

    private static final String filepath = "<div\\s*?class=\"box-img\">\\s*?<a\\s*?target=\"_blank\"\\s*?href=\".*?\">\\s*?<img\\s*?src=\"(.*?)\"\\s*?/>\\s*?</a>\\s*?</div>";

    public static void main(String[] args) {

    String html = ReptileUtil.getHtmlData("http://www.soku.com/v?keyword=%E7%A5%9E%E9%9B%95%E4%BE%A0%E4%BE%A3");
//获取页面信息

    String standardPic=simplex(html, filepath); //通过正则 匹配到图片的url地址

    //将图片地址交给工具类下载

    ReptileUtil rep = new ReptileUtil();

   File file= rep.downLoadImage(standardPic) //将图片下载到指定的文件路径下返回file 可以继续进行操作 不过该功能已经结束了

    System.out.println(file.getName());

    }

    //封装的正则匹配方法用java的Pattern

    public String simplex(String html, String script) {

        Pattern p = Pattern.compile(script);

        Matcher matcher = p.matcher(html);

        if (matcher.find()) {

            return matcher.group(1);

        }

        return "";

    }

  }

  上述功能只能是获取图片,当然也可以获取导演、演员、只要页面有的都可以根据页面的html格式来设计正则匹配就好了

  今天元宵节 祝元宵快乐
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息