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
注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。