VSCrawler是一个适合用作抓取的爬虫框架,在更多场景倾向于功能扩展性而牺牲使用简便性。这让VSCrawler非常强大,让他可以灵活的应对目标网站的反爬虫策略。
vscrawler有挺多特点
1. 多用户登录,天生支持多用户登录,各个用户资源隔离维护。
2.数据完整性保证,vs保证即使爬虫宕机也会尽力序列化爬虫任务。
3.任务调度,vs目前不支持其他爬虫框架schedular角色的定制,不过vs本身的任务调度很完善,支持自定义消重规则、断点续爬、重试规则定制、重复抓取(在消重之上封装了可重入的特性)
4.抽取器,vs结合其他爬虫框架的实现,封装了整套抽取器体系。包括css query && xpath(SipSoup,自JsoupXpath和Xsoup发展而来)、链式抽取(集合正则、xpath、css query、字符串处理函数、jsonpath)、字符串函数(基于表达式描述字符串逻辑,配合字符串函数表达式可以实现无编码支持字符串局部清洗处理)、表格处理(在css 和xpath特征都不明显的html文档上面使用很方便)
5.热发控制,vs有一个热发配置文件,只有配置文件配置项修改了,vs内部组件便可以感知到配置变更,同时执行对象更新操作。比如可以动态修改执行工作线程数量
6.代理规则,vs设计之前我便有一套完善的代理ip池系统(dungproxy),ip池本身就有基于顺序惩罚模型的权值轮询队列,基于ip质量自动探测的方式调度ip使用顺序,实现了在免费的劣质ip源上架构稳定代理服务的系统。目前vs默认集成了dungproxy,当然ip系统也是完全可以替换的
7.mq模型的事件循环系统,vs内置一个EventLoop,用来实现各个组件低耦合的通信。对于vs的深度定制几乎不需要依靠各种生命周期回调,只需要订阅感兴趣的消息,然后就可以自动接收各种消息,同时也可以发送各种消息。
本次更新,主要完善了vscrawler对注解模式爬虫的支持,自此vscrawler也可以使用java注解描述爬虫规则了。
vsvcrawler在实现注解爬虫的时候参考了webmagic和gecco两个爬虫框架,同时更好的集成了链式抽取,子model递归抽取,弱类型推测,以及提供了注解爬虫生命周期回调(用来弥补注解爬虫带来的扩展性制约问题),基于package扫描的taskbean注册等功能。
使用demo:
public class U5ProxyIpCrawler extends AbstractAutoProcessModel {
@Xpath("/span[1]/li/text()")
@Getter
private String ip;
@Xpath("//css('.port')::self()/text()")
@Getter
//type可以是一般的常用类型,框架会自动做类型转换,转换规则满足一般的弱语言规则,当不能强转时将会报错,如果你抓取的网站格式可能超过你预期范围,建议使用string来接收
private Integer port;
@Xpath("/span[3]/li/allText()")
//关于allText和text的区别,allText将会抽取子节点文本(对应Jsoup的text),text只会抽取当前节点文本(对应Jsoup的ownText),xpath语法细节请了解SipSoup这个项目
@Getter
private String anonymous;
public static void main(String[] args) {
VSCrawlerBuilder
.create()
.setProcessor(AnnotationProcessorBuilder
.create()
.registryBean(U5ProxyIpCrawler.class)
.build())
.setCrawlerName("u5ProxyCrawler")
.build()
.clearTask()
.pushSeed("http://www.data5u.com/free/index.shtml")
.run();
}
}
或者使用对子model递归解析
@AutoProcessor(seedPattern = "https://www\\.meitulu\\.com.*")
public class Star extends AbstractAutoProcessModel {
@Getter
private String starName;
@Getter
//@Xpath("/css('.listtags_r')::self()/allText()") //如果只抽文本,则使用allText
@Xpath("/css('.listtags_r')::self()/html()")
private String desciption;
@Xpath("/css('.listtags_l')::img/absUrl('src')")
//absUrl可以处理相对路径和绝对路径问题,如果url是相对路径,absUrl会自动转化为绝对路径
@Getter
private String headPicture;
@Xpath(value = "//div[@class='boxs']/ul[@class='img']/li", elementType = Album.class)
//由于泛型擦除可能,框架不能自动判断list内部的Album类型,所以需要elementType来制定,否则这里抽取得到的原始数据类型是element(Jsoup对象)
@Getter
private List<Album> albumList;
@NewSeed
@Xpath("//a/absUrl('href')")
//@JSONField(serialize = false)
private ListseedUrl;
@Override
protected void beforeAutoFetch() {
super.beforeAutoFetch();
Matcher matcher = Pattern.compile("https://www\\.meitulu\\.com/t/([^/]+)").matcher(baseUrl);
if (matcher.find()) {
starName = matcher.group(1);
}
}
}
注解爬虫详细文档稍后将会维护在项目主页:
项目demo都可以在gitee上找到: https://gitee.com/virjar/vscrawler/tree/master/vscrawler-samples
注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。