WebCollector 2.x入门教程——基本概念
2015-12-25 09:44
633 查看
WebCollector是一个无须配置、便于二次开发的JAVA爬虫框架(内核),它提供精简的的API,只需少量代码即可实现一个功能强大的爬虫。WebCollector-Hadoop是WebCollector的Hadoop版本,支持分布式爬取。
目前WebCollector在Github上维护:https://github.com/CrawlScript/WebCollector
一些程序员在单线程中通过迭代或递归的方法调用HttpClient和Jsoup进行数据采集,这样虽然也可以完成任务,但存在两个较大的问题:
1) 单线程速度慢,多线程爬虫的速度远超单线程爬虫。
2) 需要自己编写任务维护机制。这套机制里面包括了URL去重、断点爬取(即异常中断处理)等功能。
WebCollector框架自带了多线程和URL维护,用户在编写爬虫时无需考虑线程池、URL去重和断点爬取的问题。
网络爬虫会在访问页面时,从页面中探索新的URL,继续爬取。WebCollector为探索新URL提供了两种机制,自动解析和手动解析。两种机制的具体内容请读后面实例中的代码注释。
2)可以为每个URL设置附加信息(MetaData),利用附加信息可以完成很多复杂业务,例如深度获取、锚文本获取、引用页面获取、POST参数传递、增量更新等。
3)使用插件机制,WebCollector内置两套插件。
4)内置一套基于内存的插件(RamCrawler),不依赖文件系统或数据库,适合一次性爬取,例如实时爬取搜索引擎。
5)内置一套基于Berkeley DB(BreadthCrawler)的插件:适合处理长期和大量级的任务,并具有断点爬取功能,不会因为宕机、关闭导致数据丢失。
6)集成selenium,可以对javascript生成信息进行抽取
7)可轻松自定义http请求,并内置多代理随机切换功能。 可通过定义http请求实现模拟登录。
8)使用slf4j作为日志门面,可对接多种日志
9)新增了WebCollector-Hadoop,支持分布式爬取
目前WebCollector在Github上维护:https://github.com/CrawlScript/WebCollector
1.WebCollector与传统网络爬虫的区别
传统的网络爬虫倾向于整站下载,目的是将网站内容原样下载到本地,数据的最小单元是单个网页或文件。而WebCollector可以通过设置爬取策略进行定向采集,并可以抽取网页中的结构化信息。2.WebCollector与HttpClient、Jsoup的区别
WebCollector是爬虫框架,HttpClient是Http请求组件,Jsoup是网页解析器(内置了Http请求功能)。一些程序员在单线程中通过迭代或递归的方法调用HttpClient和Jsoup进行数据采集,这样虽然也可以完成任务,但存在两个较大的问题:
1) 单线程速度慢,多线程爬虫的速度远超单线程爬虫。
2) 需要自己编写任务维护机制。这套机制里面包括了URL去重、断点爬取(即异常中断处理)等功能。
WebCollector框架自带了多线程和URL维护,用户在编写爬虫时无需考虑线程池、URL去重和断点爬取的问题。
3.WebCollector能够处理的量级
WebCollector目前有单机版和Hadoop版(WebCollector-Hadoop),单机版能够处理千万级别的URL,对于大部分的精数据采集任务,这已经足够了。WebCollector-Hadoop能够处理的量级高于单机版,具体数量取决于集群的规模。4.WebCollector的遍历
WebCollector采用一种粗略的广度遍历,但这里的遍历与网站的拓扑树结构没有任何关系,用户不需要在意遍历的方式。网络爬虫会在访问页面时,从页面中探索新的URL,继续爬取。WebCollector为探索新URL提供了两种机制,自动解析和手动解析。两种机制的具体内容请读后面实例中的代码注释。
5.WebCollector 2.x版本新特性
1)自定义遍历策略,可完成更为复杂的遍历业务,例如分页、AJAX2)可以为每个URL设置附加信息(MetaData),利用附加信息可以完成很多复杂业务,例如深度获取、锚文本获取、引用页面获取、POST参数传递、增量更新等。
3)使用插件机制,WebCollector内置两套插件。
4)内置一套基于内存的插件(RamCrawler),不依赖文件系统或数据库,适合一次性爬取,例如实时爬取搜索引擎。
5)内置一套基于Berkeley DB(BreadthCrawler)的插件:适合处理长期和大量级的任务,并具有断点爬取功能,不会因为宕机、关闭导致数据丢失。
6)集成selenium,可以对javascript生成信息进行抽取
7)可轻松自定义http请求,并内置多代理随机切换功能。 可通过定义http请求实现模拟登录。
8)使用slf4j作为日志门面,可对接多种日志
9)新增了WebCollector-Hadoop,支持分布式爬取
6.WebCollector爬取新闻网站实例
import cn.edu.hfut.dmic.webcollector.model.CrawlDatums; import cn.edu.hfut.dmic.webcollector.model.Page; import cn.edu.hfut.dmic.webcollector.plugin.berkeley.BreadthCrawler; import org.jsoup.nodes.Document; /** * Crawling news from hfut news * * @author hu */ public class NewsCrawler extends BreadthCrawler { /** * @param crawlPath crawlPath is the path of the directory which maintains * information of this crawler * @param autoParse if autoParse is true,BreadthCrawler will auto extract * links which match regex rules from pag */ public NewsCrawler(String crawlPath, boolean autoParse) { super(crawlPath, autoParse); /*种子页面*/ this.addSeed("http://news.hfut.edu.cn/list-1-1.html"); /*正则规则设置*/ /*爬取符合 http://news.hfut.edu.cn/show-xxxxxxhtml的URL*/ this.addRegex("http://news.hfut.edu.cn/show-.*html"); /*不要爬取 jpg|png|gif*/ this.addRegex("-.*\\.(jpg|png|gif).*"); /*不要爬取包含 # 的URL*/ this.addRegex("-.*#.*"); } @Override public void visit(Page page, CrawlDatums next) { String url = page.getUrl(); /*判断是否为新闻页,通过正则可以轻松判断*/ if (page.matchUrl("http://news.hfut.edu.cn/show-.*html")) { /*we use jsoup to parse page*/ Document doc = page.getDoc(); /*extract title and content of news by css selector*/ String title = page.select("div[id=Article]>h2").first().text(); String content = page.select("div#artibody", 0).text(); System.out.println("URL:\n" + url); System.out.println("title:\n" + title); System.out.println("content:\n" + content); /*如果你想添加新的爬取任务,可以向next中添加爬取任务, 这就是上文中提到的手动解析*/ /*WebCollector会自动去掉重复的任务(通过任务的key,默认是URL), 因此在编写爬虫时不需要考虑去重问题,加入重复的URL不会导致重复爬取*/ /*如果autoParse是true(构造函数的第二个参数),爬虫会自动抽取网页中符合正则规则的URL, 作为后续任务,当然,爬虫会去掉重复的URL,不会爬取历史中爬取过的URL。 autoParse为true即开启自动解析机制*/ //next.add("http://xxxxxx.com"); } } public static void main(String[] args) throws Exception { NewsCrawler crawler = new NewsCrawler("crawl", true); /*线程数*/ crawler.setThreads(50); /*设置每次迭代中爬取数量的上限*/ crawler.setTopN(5000); /*设置是否为断点爬取,如果设置为false,任务启动前会清空历史数据。 如果设置为true,会在已有crawlPath(构造函数的第一个参数)的基础上继 续爬取。对于耗时较长的任务,很可能需要中途中断爬虫,也有可能遇到 死机、断电等异常情况,使用断点爬取模式,可以保证爬虫不受这些因素 的影响,爬虫可以在人为中断、死机、断电等情况出现后,继续以前的任务 进行爬取。断点爬取默认为false*/ //crawler.setResumable(true); /*开始深度为4的爬取,这里深度和网站的拓扑结构没有任何关系 可以将深度理解为迭代次数,往往迭代次数越多,爬取的数据越多*/ crawler.start(4); } }
相关文章推荐
- 我投了份简历,接到了十八个骚扰电话
- 使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
- apache禁止搜索引擎收录、网络爬虫采集的配置方法
- python3简单实现微信爬虫
- python使用rabbitmq实现网络爬虫示例
- 垂直型爬虫架构设计(1)
- 垂直型爬虫架构设计(2)
- 小编详解网络蜘蛛的安全隐患及预防方法
- 利用DHT网络原理制作bt采集蜘蛛,开源版
- 现在公开一个DHT网络爬虫网络爬虫供大家一起交流
- 利用DHT网络原理制作bt采集蜘蛛,开源版
- 利用DHT网络原理制作bt采集蜘蛛,开源版
- 现在公开一个DHT网络爬虫网络爬虫供大家一起交流
- HtmlParser应用,使用Filter从爬取到的网页中获取需要的内容
- 网络爬虫(源代码) 转载Ackarlix
- python下安装美汤beautifulsoup包过程
- Python处理中文文本字符时提取某个汉字或字符的方法
- 10月10日基础班开班了——广州传智播客
- Torrent文件
- 数学之美系列六 -- 图论和网络爬虫 (Web Crawlers)