zoukankan      html  css  js  c++  java
  • crawler4j图片爬虫

    该实例主要演示下如何爬取指定网站的图片;

    代码中有详细注释:

    首先写一个ImageCrawler类:

    package com.demo.imageCrawler4j;
     
    import java.io.File;
    import java.io.IOException;
    import java.util.UUID;
    import java.util.regex.Pattern;
     
    import com.google.common.io.Files;
     
    import edu.uci.ics.crawler4j.crawler.Page;
    import edu.uci.ics.crawler4j.crawler.WebCrawler;
    import edu.uci.ics.crawler4j.parser.BinaryParseData;
    import edu.uci.ics.crawler4j.url.WebURL;
     
    /*
     * 这个类主要是爬取图片,并且存储到指定文件夹
     */
    public class ImageCrawler extends WebCrawler {
     
      /*
       * 指定文件后缀过滤
       */
      private static final Pattern filters = Pattern
          .compile(".*(\.(css|js|mid|mp2|mp3|mp4|wav|avi|mov|mpeg|ram|m4v|pdf" + "|rm|smil|wmv|swf|wma|zip|rar|gz))$");
     
      /*
       * 正则匹配图片文件
       */
      private static final Pattern imgPatterns = Pattern.compile(".*(\.(bmp|gif|jpe?g|png|tiff?))$");
     
      private static File storageFolder; // 爬取的图片本地存储地址
      private static String[] crawlDomains; // 指定要爬取的域名
     
      /**
       * 配置方法 指定域名和本地存储文件
       * @param domain
       * @param storageFolderName
       */
      public static void configure(String[] domain, String storageFolderName) {
        crawlDomains = domain;
     
        storageFolder = new File(storageFolderName); // 实例化
        if (!storageFolder.exists()) { // 假如文件不存在
          storageFolder.mkdirs(); // 我们创建一个
        }
      }
     
      /**
       * 这个方法主要是决定哪些url我们需要抓取,返回true表示是我们需要的,返回false表示不是我们需要的Url
       * 第一个参数referringPage封装了当前爬取的页面信息
       * 第二个参数url封装了当前爬取的页面url信息
       */
      @Override
      public boolean shouldVisit(Page referringPage, WebURL url) {
        String href = url.getURL().toLowerCase(); // 得到小写的url
        if (filters.matcher(href).matches()) { // 过滤指定后缀url
          return false;
        }
     
        if (imgPatterns.matcher(href).matches()) { // 匹配指定图片后缀文件
          return true;
        }
     
        for (String domain : crawlDomains) { // 匹配指定域名
          if (href.startsWith(domain)) {
            return true;
          }
        }
        return false;
      }
     
      /**
       * 当我们爬到我们需要的页面,这个方法会被调用,我们可以尽情的处理这个页面
       * page参数封装了所有页面信息
       */
      @Override
      public void visit(Page page) {
        String url = page.getWebURL().getURL(); // 获取url
     
        // 只爬取大于等于10kB的图片文件
        if (!imgPatterns.matcher(url).matches() ||
            !((page.getParseData() instanceof BinaryParseData) || (page.getContentData().length < (10 * 1024)))) {
          return;
        }
     
        // 获取图片后缀
        String extension = url.substring(url.lastIndexOf('.'));
        String hashedName = UUID.randomUUID() + extension; // 通过uuid 拼接成唯一图片名称
     
        // 定义存储文件
        String filename = storageFolder.getAbsolutePath() + "/" + hashedName;
        try {
          Files.write(page.getContentData(), new File(filename)); // 把爬取到的文件存储到指定文件
          System.out.println("爬取图片的url:"+url);
        } catch (IOException iox) {
           iox.printStackTrace();
        }
      }
    }

    再写一个图片爬虫控制器:ImageCrawlController

    package com.demo.imageCrawler4j;
     
     
    import edu.uci.ics.crawler4j.crawler.CrawlConfig;
    import edu.uci.ics.crawler4j.crawler.CrawlController;
    import edu.uci.ics.crawler4j.fetcher.PageFetcher;
    import edu.uci.ics.crawler4j.robotstxt.RobotstxtConfig;
    import edu.uci.ics.crawler4j.robotstxt.RobotstxtServer;
     
    /**
     * 图片爬虫控制器
     * @author user
     *
     */
    public class ImageCrawlController {
     
          public static void main(String[] args) throws Exception {
         
     
            String rootFolder =  "c:/crawl"; // 定义爬虫数据存储位置
            int numberOfCrawlers = 7; // 定义7个爬虫,也就是7个线程
            String storageFolder = "c:/crawl/data"; // 定义爬取的图片本地存储位置
     
            CrawlConfig config = new CrawlConfig(); // 实例化爬虫配置
     
            config.setCrawlStorageFolder(rootFolder); // 设置爬虫文件存储位置
     
            /*
             * 设置允许爬取二进制文件 
             * 因为图片属于二进制文件
             */
            config.setIncludeBinaryContentInCrawling(true);
     
            String[] crawlDomains = {"http://669pic.com/"};
     
            /*
             * 实例化爬虫控制器
             */
            PageFetcher pageFetcher = new PageFetcher(config); // 实例化页面获取器
            RobotstxtConfig robotstxtConfig = new RobotstxtConfig(); // 实例化爬虫机器人配置 比如可以设置 user-agent
             
            // 实例化爬虫机器人对目标服务器的配置,每个网站都有一个robots.txt文件 规定了该网站哪些页面可以爬,哪些页面禁止爬,该类是对robots.txt规范的实现
            RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher);
            // 实例化爬虫控制器
            CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);
             
            /*
             * 配置爬虫种子页面,就是规定的从哪里开始爬,可以配置多个种子页面
             */
            for (String domain : crawlDomains) {
              controller.addSeed(domain);
            }
     
            ImageCrawler.configure(crawlDomains, storageFolder); // 配置爬虫域名,以及本地存储位置
     
            /*
             * 启动爬虫,爬虫从此刻开始执行爬虫任务,根据以上配置
             */
            controller.start(ImageCrawler.class, numberOfCrawlers);
          }
        }
  • 相关阅读:
    arclinux安装报错unknown trust
    linux微型主机服务器配置
    spring data jpa + hibernate
    又纠结activiti
    comet4j
    shiro纠结之旅
    ubuntu更改jdk版本的问题
    struts上传
    java实现四则运算
    6 个重构方法可帮你提升 80% 的代码质量(转)
  • 原文地址:https://www.cnblogs.com/iathanasy/p/8109439.html
Copyright © 2011-2022 走看看