Crawler4j学习笔记
Crawler4j概述
crawler4j是一款基于Java的轻量级单机开源爬虫框架,最大的一个特点就是简单。另外也支持多线程、支持代理、可以过滤重复URL
基本上从加载jar到工程里面 通过修改示例的代码就可以简单的实现一个爬虫的全部功能,而这一切动作加起来都不需要超过半个小时。
爬虫安装
官方文档里面提到了两种方式,一种通过Maven安装(一种开发工具),但是因为这里又涉及到了一种新的工具的学习,有花费大量时间的可能,遂果断放弃。另外一种安装方式就是导入.jar包,通过开发版本链接然后加入到Java工程里面就可轻松完成(虽然整个jar包体积庞大达32M)
官方网址:https://github.com/yasserg/crawler4j
jar链接:https://github.com/yasserg/crawler4j/releases
爬虫使用
使用爬虫最基本要完成两个类:继承WebCrawler的MyCrawler类 以及可以控制多个爬虫的Controller类。
WebCrawler类:
这里要必须要做的是对于两个方法的重写
public boolean shouldVisit(Page referringPage, WebURL url)
public void visit(Page page)
shouldVisit方法决定一个给定的URL是否英爱访问,这里主要是通过对于模式的限制来实现的
visit:解析网页内容,page类包含了丰富的方法,可以利用这些方法得到网页的内容和属性。
例如:如果想爬取指定贵的页面,可以修改BasicCrawler的shouldVisit方法
private final static Pattern FILTERS = Pattern.compile(".*(\\.(css|js|bmp|gif|jpe?g" + "|png|tiff?|mid|mp2|mp3|mp4"
+ "|wav|avi|mov|mpeg|ram|m4v|pdf" + "|rm|smil|wmv|swf|wma|zip|rar|gz))$");
/**
* 是否抓取页面
*/
@Override
public boolean shouldVisit(WebURL url) {
String href = url.getURL().toLowerCase();
return !FILTERS.matcher(href).matches() && href.startsWith("http://www.ics.uci.edu/");
}
Controller类:
这个类用来控制爬虫,首先在这个类中addseed,然后开启多个爬虫,并且不断监听各个爬虫的存活状态。
在controller类中,可以设置爬虫的相关属性
/* * 爬取时数据临时存放目录. */
String crawlStorageFolder = "D:/tmp";
/* * 爬取线程数,即同时有多少个爬虫工作. */
int numberOfCrawlers = 5;
爬取指定的网站:
/*
* 添加入口URL
*/
controller.addSeed("http://www.ics.uci.edu/");
controller.addSeed("http://www.ics.uci.edu/~lopes/");
controller.addSeed("http://www.ics.uci.edu/~welling/");
/*
* 开始工作
*/
controller.start(BasicCrawler.class, numberOfCrawlers);
另外在controller里面还可以设置爬取的数量以及爬取的深度
/*
* 深度,即从入口URL开始算,URL是第几层。如入口A是1,从A中找到了B,B中又有C,则B是2,C是3
*/
config.setMaxDepthOfCrawling(2);
/*
* 最多爬取多少个页面
*/
config.setMaxPagesToFetch(1000);
这样就实现了一个简单的爬虫,但是在我们的项目里面必定会涉及到深层次的功能,例如爬取记录的保存与重新载入(避免每次运行之间不能避免重复),以及爬取不能解析的格式的文件 这些功能都还有待研究 请期待后续更新
Crawler4j学习笔记的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
- DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记
今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...
随机推荐
- Linux-设置环境变量
一般来说,配置交叉编译工具链的时候需要指定编译工具的路径,此时就需要设置环境变量.例如我的mips-linux-gcc编译器在“ /opt/au1200_rm/build_tools/bin”目录下, ...
- UTF-8 有BOM和无BOM
BOM(byte order mark)是为 UTF-16 和 UTF-32 准备的,用于标记字节序(byte order).微软在 UTF-8 中使用 BOM 是因为这样可以把 UTF-8 和 AS ...
- C++及数据结构笔试面试常见知识点总结
一些常考的基础知识点个人总结,大神勿喷,欢迎指正. 1.广义表的表尾是指除去表头后剩下的元素组成的表,表头可以为表或单元素值.表尾或为表,或为空表. 2.构造函数不能声明为虚函数. 构造函数为什么不能 ...
- [VS]vs的宏
宏的查看: 我们在Visual Studio中经常会接触到形如$(TargetFileName)这样的VS宏.它们不是全局宏,不能在一般CMD窗口中通过set命令查看, 但是可以通过VS的命令窗口打开 ...
- Windows Azure上搭建SSTP VPN
一.服务器设置 首先,从0开始,你需要创建一个新的VM.我选择Windows Server 2012 R2,所有步骤和创建普通VM都一样,但最后在防火墙设置里一定要打开TCP 443端口: 创建完成后 ...
- What am I missing out in life if I don't have a girlfriend?
http://www.quora.com/What-am-I-missing-out-in-life-if-I-dont-have-a-girlfriend/answer/Kelly-Erickson ...
- linux命令存放 bash: xxx command not found
参考资料:http://blog.sina.com.cn/s/blog_688077cf01013qrk.html 提示:bash: xxx command not found 首先就要考虑root ...
- JS创建自定义对象
普通对象的创建: 创建对象: 1.people = new Object(); people.name = "lin"; people.age = "26“; 2.创建字 ...
- 设置navigation baritem方法
UIButton *RightBtn=[UIButton buttonWithType:UIButtonTypeRoundedRect]; [RightBtn setImage:[UIImage im ...
- 数组prototype添加函数呢,采用回调判定函数内容
1.解决方案 Array.prototype.all = function (p) { return this.filter(p).length == this.length; }; Array.pr ...