- 官方网站:https://github.com/CrawlScript/WebCollector
- 是否支持分布式:该框架同时包含了单机版和分布式版两个版本
- 可扩展性:强
- 适用性:WebCollector适用于精抽取业务。
- 上手难易度:简单
WebCollector 2.x 版本的 tutorial(教程) (2.20以上) 2.x版本特性:
- 自定义遍历策略,可完成更为复杂的遍历业务;例如分页、AJAX
- 可以为每个URL设置附加信息( MetaData),利用附加信息可以完成很多复杂业务,例如深度获取、锚文本获取、引用页面获取、POST参数传递、增量更新等。
- 使用插件机制,WebCollector内置两套插件。
- 内置一套基于内存的插件(RamCrawler<内存爬虫>),不依赖文件系统或数据库,适合一次性爬取,例如实时爬取搜索引擎。
- 内置一套基于Berkeley DB(BreadthCrawler<广度爬虫>)的插件:适合处理长期和大量级的任务,
- 并具有断点爬取功能,不会因为宕机、关闭导致数据丢失。
- 集成 selenium,可以对 javascript 生成信息进行抽取
- 可轻松自定义 http 请求,并内置多代理随机切换功能。 可通过定义http 请求实现模拟登录。
- 使用 slf4j 作为日志门面,可对接多种日志
实战(来自官方教程,该博文仅是本人为了更方便学习)
实际使用时建议按照 DemoTypeCrawler的方式操作,该教程目的为阐述 meta的原理;
* 可以往 CrawlDatums 中添加希望后续爬取的任务,任务可以是 URL 或者 CrawlDatum爬虫不会重复爬取任务;
* 从 2.20版之后,爬虫根据 CrawlDatum的key去重,而不是URL;
* 因此如果希望重复爬取某个URL,只要将 CrawlDatum 的 key 设置为一个历史中不存在的值即可;
* 例如增量爬取,可以使用 爬取时间+URL作为key;
* 新版本中,可以直接通过 page.select(css选择器)方法来抽取网页中的信息;
* 等价于page.getDoc().select(css选择器)方法,page.getDoc()获取到的是Jsoup中的Document对象;
解析meta
1、meta 是 CrawlDatum 的附加信息,爬虫内核并不使用 meta 信息;
2、在解析页面时,往往需要知道当前页面的类型(例如是标签页、列表页、内容页)
或一些附加信息(例如页号);
3、然而根据当前页面的信息(内容和URL)并不一定能够轻易得到这些信息;
4、例如当在解析页面 https://book.douban.com/tag/时,需要知道该页是目录页还是内容页;
5、虽然用正则也可以解决这个问题,但是相比之下使用 meta会更加快捷;
6、当我们将一个新链接(CrawlDatum)提交给爬虫时,链接指向页面的类型有时是确定的;
(例如在很多任务中,种子页面就是列表页)
7、如果在提交CrawlDatum时,直接将链接的类型信息(type)存放到meta中;
8、那么在解析页面时,只需取出链接(CrawlDatum)中的类型信息(type)即可知道当前页面类型
解析autoParse:
为指定 autoParse 参数时,父类默认为true ,即会自动解析页面中的所有超链接
因为没有使用 crawler.addRegex()正则匹配,所以为true也不会影响,等同于手动
分解代码:
visit(Page page, CrawlDatums next):
main(String[] args):