爬虫_Crawler4j的使用
Crawler4j的使用
(以下内容全部为转载,供自己查阅用)
下载地址:
http://code.google.com/p/crawler4j/
Crawler4j的使用
网上对于crawler4j这个爬虫的使用的文章很少,Google到的几乎没有,只能自己根据crawler4j的源码进行修改。这个爬虫最大的特点就是简单易用,他连API都不提供。刚开始的时候实在恨不能适应。好在他的源码也提供了几个例子。对于一般的应用大可以直接修改它的例子。
使用方法很简单,直接用Eclipse打开工程。可以看到src下有三个demo例子。说一下最简单的simple例子。
使用crawler4j的关键的继承WebCrawler类实现自己的爬虫类MyCrawler,然后根据需要覆盖WebCrawler的几个函数就可以了。
public boolean shouldVisit(WebURL url) // 根据url进行网页的解析,对返回为TRUE的网页进行抓取。
public void visit(Page page) // 解析网页内容,page类包含了丰富的方法,可以利用这些方法得到网页的内容和属性。
Crawler包
Crawler.CrawController 控制爬虫,先addseed,再开启多个爬虫,并不断监听各个爬虫存活状态。
Crawler.WebCrawler 爬虫
1. Run():不断循环,每次从Frontier拿50条url,对每条url,processPage(curUrl)。
2. processPage(curURL):用PageFetcher.fetch爬取网页,如果curURL有redirect,则将redirect url的url加入Frontier,以后再调度;如果爬取正常,则先进行parse,生成Page,将新urls降入Frontier(新加入url的深度此时确定),调用visit(Page){用户自定义操作}。
Crawler.Configurations 读取crawler4j.properties中的信息
Crawler.PageFetcher 启动IdleConnectionMonitorThread,用fetch(Page, ignoreIfBinary),爬取单个Page页面。是一个static类。
Crawler.Page 一个页面
Crawler.PageFetchStatus 单个页面爬取的配置,如返回爬取状态数字所代表的含义等等。
Crawler.HTMLParser 对HTML源码进行parse,存入Page中。
Crawler.LinkExtractor 抽取出一个HTML页面中包含的所有link。
Crawler.IdleConnectionMonitorThread 用来监听连接器(用来发送get请求,获取页面),其connMgr则负责HTML请求的发送。
url包
url.WebURL 代表一条url,内含docid, depth, url值
url.URLCanonicalizer 将url进行normalize
Frontier包
Frontier.Frontier
Init() 如果resumable,则从env所指home中读取已处理过得urls,scheduleAll加入调度workQueue中。
Frontier.workQueues 要处理的页面集,如果resumable,在构造时会打开对应env中的database(PendingURLsDB),获取上一次遗留的未处理的urls。
Frontier.inprocessPages 当前正在处理的页面集,继承workQueues,存入InProcessPagesDB数据库。
Frontier.DocIDServer 对应数据库DocIDs,记录已经见过的页面url。
处理流程:newurl--->workQueues--->inprovessPages--->delete
Robotstxt包,用来判断url是否被允许。
Util包,用来提供一些小工具。
注意点:
1. seed页面深度为0。
2. url去重利用的是DocIDServer.newdocid(url),如果该值大于0,则表示该url以前见过。通过这个机制,所有以前见过的页面都可以被记录识别。
3. 当设定resumable后,程序跑完后就会把PendingURLsDB和DocIDs保存下来。
4. 如果不设定resumable,在运行程序前,会把env对应的home目录清空。
------------------------------------------------------------------------------
由于最近做实验需要使用到大量的新闻语料库,在网上找了一些都不是自己想要的,所以决定自己写个小程序去爬取New York Times(NYT)上的网页新闻。
用Java写的爬虫程序有很多,我找了一个叫crawler4j的开源爬虫,这是一个多线程的爬虫,功能比较简单,源代码也比较容易看懂,由于我要对爬虫爬取链接进行一些修改,就直接下了crawler4j的源码加到我自己的工程中。
然后对爬下来的网页进行处理,使用的是htmlparser这个工具,得到了我要的新闻的Title、Publication Time、Discription、正文等信息。为了更好的组织这些信息,我把这些信息存储到XML文档中。
花了两个晚上的时间,爬虫程序可以跑起来了,写程序的时候遇到了几个问题。
1. 在xml中是使用 "\n" 来表示换行的,而在windows中是使用 "\r\n" 来表示换行符的,所以你要是把含有换行符的文本保存到xml文档时他会自动的把 "\r" 转换成转义符 "& #13;" ,要处理掉这个的话,你可以直接把文本里的 "\r" 给删了就行了。
2. 使用Java中的String.replaceAll(regex, replacement)这个函数时又犯了一个很低级的错误,就是如果执行str.replaceAll(regex, replacement) 时并没有改变str本身的值,所以说要替换str自身的某些字符串时需要执行 str=str.replaceAll(regex, replacement) ,没有意识的这个问题的后果就是花了很长时间在纠结我的程序哪儿出问题了,已经是第二次犯这个错误了,以后不能再犯了啊。
3. 爬取国外的网站资源太慢了,程序开了两个小时左右才爬取了3000篇新闻,慢的可怜啊,希望多开几个线程看看能不能提升一点效果,要是是由于网速的原因的话,可能效果不大。
----------------------------------------------------------------------------
Crawler4j的退出问题
这个问题在网上找了好久也没有好的解决方案,网上的说法是这个爬虫只支持手动强制关闭。无奈只能自己看他的源代码,好在他的源代码也不多。目前的解决方案是。。。直接上代码吧
一、edu.uci.ics.crawler4j.crawler.CrawlController类
public CrawlController(String storageFolder) throws Exception {
。。。
// 新建一个监控线程,不知管什么用
// PageFetcher.startConnectionMonitorThread();
}
public <T extends WebCrawler> void start(Class<T> _c, int numberOfCrawlers) {
。。。
// 设置停止标志
sign_stop = false;
while (true) {
。。。
}
// 停止线程
if(sign_stop){
for (int i = 0; i < crawlers.size(); i++) {
crawlers.get(i).setStop(true);
}
return;
}
if (!someoneIsWorking) {
。。。
}
public void stop() {
sign_stop = true;
}
二、edu.uci.ics.crawler4j.crawler.WebCrawler类
// 停止标志
private boolean stop;
public void run() {
onStart();
stop = false;
while (!stop) {
。。。
}
}
爬虫_Crawler4j的使用的更多相关文章
- 设计爬虫Hawk背后的故事
本文写于圣诞节北京下午慵懒的午后.本文偏技术向,不过应该大部分人能看懂. 五年之痒 2016年,能记入个人年终总结的事情没几件,其中一个便是开源了Hawk.我花不少时间优化和推广它,得到的评价还算比较 ...
- Scrapy框架爬虫初探——中关村在线手机参数数据爬取
关于Scrapy如何安装部署的文章已经相当多了,但是网上实战的例子还不是很多,近来正好在学习该爬虫框架,就简单写了个Spider Demo来实践.作为硬件数码控,我选择了经常光顾的中关村在线的手机页面 ...
- Python 爬虫模拟登陆知乎
在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...
- scrapy爬虫docker部署
spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...
- scrapy 知乎用户信息爬虫
zhihu_spider 此项目的功能是爬取知乎用户信息以及人际拓扑关系,爬虫框架使用scrapy,数据存储使用mongo,下载这些数据感觉也没什么用,就当为大家学习scrapy提供一个例子吧.代码地 ...
- 120项改进:开源超级爬虫Hawk 2.0 重磅发布!
沙漠君在历时半年,修改无数bug,更新一票新功能后,在今天隆重推出最新改进的超级爬虫Hawk 2.0! 啥?你不知道Hawk干吗用的? 这是采集数据的挖掘机,网络猎杀的重狙!半年多以前,沙漠君写了一篇 ...
- Python爬虫小白入门(四)PhatomJS+Selenium第一篇
一.前言 在上一篇博文中,我们的爬虫面临着一个问题,在爬取Unsplash网站的时候,由于网站是下拉刷新,并没有分页.所以不能够通过页码获取页面的url来分别发送网络请求.我也尝试了其他方式,比如下拉 ...
- Python多线程爬虫爬取电影天堂资源
最近花些时间学习了一下Python,并写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址,代码已经上传到GitHub上了,需要的同学可以自行下载.刚开始学习python希望可以获得宝贵的意见. ...
- QQ空间动态爬虫
作者:虚静 链接:https://zhuanlan.zhihu.com/p/24656161 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 先说明几件事: 题目的意 ...
随机推荐
- RSA 加解密算法
与DES不同,RSA算法中,每个通信主体都有两个钥匙,一个公钥一个私钥. 就是有2把钥匙1.使用publicKey可以对数据进行加密2.使用Key才能对数据进行解密单方向传输用公钥加密的数据,只有私钥 ...
- Storyboards
这里是吐槽时间,换掉了mac默认的输入法,出发点只有一个,就是切换中英文输入的时候相当不爽.也许是习惯了其他各大输入法的一键切换,而又没有找到自带输入法可设置的地方. Segue 以前我们使用navi ...
- [Unity3D]上海某大型游戏公司的基础面试题
一个小老乡跟我聊到去上海某大公司的基础面试题,面试结果不尽如人意,但还是分享了下面试的试题,刚刚第一次录制视频,给某人讲课,我感觉讲的还算比较耐心,但发现一些新手入门学习的弊端,可能是很普遍的现象,这 ...
- Android数据缓存(转)
Android数据缓存 1.http://blog.csdn.net/lnb333666/article/details/8460159 2.https://github.com/Trinea/a ...
- Emacs 之窗口管理
// */ // ]]> Emacs 之窗口管理 Table of Contents 1. Emacs 窗口相关 1.1. Emacs 里调整 window 大小 1.2. Emacs winn ...
- 记录Android Studio项目提交到github上的出错处理
首先是按照网上的教程进行了一次提交,具体见http://web.gxzj.com.cn/News.aspx?id=325505 记得当时出现过这个错误Can't connect to reposito ...
- jquery尺寸:宽度与高度
width() 方法设置或返回元素的宽度(不包括内边距.边框或外边距). height() 方法设置或返回元素的高度(不包括内边距.边框或外边距). innerWidth() 方法返回元素的宽度(包括 ...
- DOM--4 响应用户操作和事件(1)
简介 事件:事件并不是以"on"开头的.例如,onclick引用的是一个对象的属性,click才是事件. 事件侦听器:当指定的事件发生时会执行的函数或方法. 事件注册:为DOM元素 ...
- 05_Java异常(Exception)
1. 异常的概念 1.1什么是异常 异常指的是程序运行时出现的不正常情况. 1.2异常的层次 Java的异常类是处理运行时的特殊类,每一种异常对应一种特定的运行错误.所有Java异常类都是系统类库中E ...
- 原生Ajax写法(GET)
ajax的GET提交方式的原生代码: var xhr = null; if(window.XMLHttpRequest){ xhr = new XMLHttpRequest(); }else if(w ...