java1234开源博客系统
博客信息

crawler4j图片爬虫

0
发布时间:『 2016-06-06 11:04』  博客类别:java爬虫技术  阅读(9194) 评论(0)

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

代码中有详细注释:


首先写一个ImageCrawler类:

package com.java1234.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.java1234.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://www.java1234.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);
	  }
	}


我们执行下:

控制台输出:

c.jpg


本地图片存储:

d.jpg


这些就是爬虫下载下来的图片文件;


当然我的站点有防火墙,不可能一直让程序这么爬;所以爬一会会出现403错误;


所以后面会介绍 使用代理IP;


完整代码:http://pan.baidu.com/s/1i46Al4h

关键字:   crawler4j     爬虫  
关注Java1234微信公众号
博主信息
Java1234_小锋
(知识改变命运,技术改变世界)
Powered by Java1234 V3.0 Copyright © 2012-2016 Java知识分享网 版权所有