[聚合文章] vscrawler 0.2.1发布,适合用作抓取的爬虫框架

CSS 2017-12-16 17 阅读

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

项目文档: http://vscrawler.virjar.com/

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