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);
}
}
crawler4j图片爬虫的更多相关文章
- Python爬虫02——贴吧图片爬虫V2.0
Python小爬虫——贴吧图片爬虫V2.0 贴吧图片爬虫进阶:在上次的第一个小爬虫过后,用了几次发现每爬一个帖子,都要自己手动输入帖子链接,WTF这程序简直反人类!不行了不行了得改进改进. 思路: 贴 ...
- Python图片爬虫
1.今天给大家介绍自己写的一个图片爬虫,说白了就是从网页自动上下载需要的图片 2.首先选取目标为:http://www.zhangzishi.cc/涨姿势这个网站如下图,我们的目标就是爬取该网站福利社 ...
- Java 图片爬虫,java打包jar文件
目录 1. Java 图片爬虫,制作 .jar 文件 spider.java 制作 jar 文件 添加执行权限 1. Java 图片爬虫,制作 .jar 文件 spider.java spider.j ...
- C#多线程图片爬虫
写了个简单的多线程图片爬虫,整理一下.数据已经爬下来了,图片URL需要自行拼接,首先从Lawyers表中取的RawData字段,RawData中有一个list字段是json格式的数据,需要的只是lis ...
- 【Python爬虫实战】 图片爬虫-淘宝图片爬虫--千图网图片爬虫
所谓图片爬虫,就是从互联网中自动把对方服务器上的图片爬下来的爬虫程序.有些图片是直接在html文件里面,有些是隐藏在JS文件中,在html文件中只需要我们分析源码就能得到如果是隐藏在JS文件中,那么就 ...
- 我的图片爬虫demo
本来是根据scrapy教程写了一个下载图片的简易爬虫,但是搞了一天,死活下载不了图片. 然后换了一个网站,用原生的库写了一个图片爬虫. import urllib.requestimport osde ...
- 【Python】nvshens按目录批量下载图片爬虫1.00(单线程版)
# nvshens按目录批量下载图片爬虫1.00(单线程版) from bs4 import BeautifulSoup import requests import datetime import ...
- Jmeter(四十一)_图片爬虫
今天教大家用元件组合,做一个网页图片爬虫. 需要用到的元件:循环控制器+计数器+xpath提前器+函数嵌套+beanshell代码 首先我们确定一下要爬取的图片网站:https://dp.pconli ...
- python写的百度图片爬虫
学了一下python正则表达式,写一个百度图片爬虫玩玩. 当技术遇上心术不正的人,就成我这样的2B青年了. python3.6开发.程序已经打包好,下载地址: http://pan.baidu.com ...
随机推荐
- 洛谷P2391 白雪皑皑(并查集)
题目背景 “柴门闻犬吠,风雪夜归人”,冬天,不期而至.千里冰封,万里雪飘.空中刮起了鸭毛大雪.雪花纷纷,降落人间. 美能量星球(pty 在 spore 上的一个殖民地)上的人们被这美景所震撼.但是 p ...
- nodejs -- crypto MD5签名
MD5使用方法: const crypto = require('crypto'); var obj = crypto.createHash('md5'); // 可多次调用 update obj.u ...
- 部署TaskBoard
部署TaskBoard kiswa/TaskBoard: A Kanban-inspired app for keeping track of things that need to get done ...
- Linux 内核剖解(转)
Linux 内核剖析(转) linux内核是一个庞大而复杂的操作系统的核心,不过尽管庞大,但是却采用子系统和分层的概念很好地进行了组织.在本文中,您将探索 Linux 内核的总体结构,并学习一些主要 ...
- 系统A一定会按照自我的样子改造世界
A一定会按照自己的样子去构建系统A1,A1一定还会按照自己的样子去构建系统A1.1,A1.1一定还是会按照自我的样子去构建A1.1.1……我们编程,我们改造世界,我们的方向是被注定要朝着构建人造人的方 ...
- 利用chrome浏览器断电调试确定函数触发的位置
比如某天遇到这样一个问题,页面有一个按钮,上面绑定了事件可能是多个事件,然后我们点击后出现了bug,我们要如何快速定位到这个事件,如果页面只有一个js或少量的js,我们一个打开查找,也可以接受.但是如 ...
- H3C交换机telnet服务认证模式配置
以H3C交换机为例,介绍telnet服务的三种认证方式配置(none无需认证,password密码认证,scheme账户+密码认证) None认证模式配置步骤:[H3C]telnet server e ...
- 【转】【Oracle 集群】Oracle 11G RAC教程之集群安装(七)
原文地址:http://www.cnblogs.com/baiboy/p/orc7.html 阅读目录 目录 集群安装 参考文献 相关文章 Oracle 11G RAC集群安装(七) 概述:写下本文档 ...
- js实现图片上传预览功能,使用base64编码来实现
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- Project Euler 8 Largest product in a series
题意:寻找这 1000 个数中相邻 13 个数相乘积最大的值 思路:首先想到的是暴力,但是还可以利用之前记录过的数值,什么意思呢?即在计算 2 - 14 后,再计算 3 - 15 时完全可以利用之前计 ...