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);
          }
        }
  • 相关阅读:
    还在使用golang 的map 做Json编码么?
    Golang 性能测试(2) 性能分析
    golang 性能测试 (1) 基准性能测试
    消息队列 NSQ 源码学习笔记 (五)
    消息队列 NSQ 源码学习笔记 (四)
    消息队列 NSQ 源码学习笔记 (三)
    消息队列 NSQ 源码学习笔记 (二)
    消息队列 NSQ 源码学习笔记 (一)
    你不知道的空格
    Supervisor 使用和进阶4 (Event 的使用)
  • 原文地址:https://www.cnblogs.com/iathanasy/p/8109439.html
Copyright © 2011-2022 走看看