一套简单的java爬虫框架VW-Crawler发布啦!!!

VW-Crawler

背景

自己一直对爬虫比较感兴趣,大学的毕业论文也是一个爬虫项目(爬教务处信息,然后做了个Android版教务管理系统,还获得了优秀毕业设计的称号),自那以后遇到自己感兴趣的网站就会去抓一下。前段时间工作上需要一些JD信息,我就从网上找了个开源的爬虫框架WebMagic,使用简单,易配置,功能也很强大,当然了也有些网站的数据不适合使用。前前后后写了不下十几个,慢慢的就想是不是可以把这些爬虫代码再抽象出来,做出一个简易的爬虫框架呢?于是就尝试去看WebMagic的源码,后来又发现了一个源码比较容易解读的爬虫框架XXL-CRAWLER,简单的分析了源码之后,开发自己一套爬虫框架的欲望更加强烈,于是在2017年底的时候就开始了开发,中间断断续续得停了写,写了停。直到最近8月底的时候才算出了一个版本,然后顺势把它放到了Maven公服仓库上。一个人的力量很薄弱,要想完善这个爬虫的健壮性、可用性和易扩展性还需要大家的力量!

特点

  • 语言: Java开发,框架比较简单,多处使用的是接口编程,是学习Java不错的例子
  • 难度: 及其简单,配置一下,写个解析逻辑,整理下保存方法,就OK了
  • 轻量: 使用Jsoup做默认的下载器,依赖性较低
  • 线程: 可自主设置线程数抓取,提高抓取效率
  • 重试: 支持失败重试,次数可以自定义
  • 代理: 支持配置代理池,默认随机使用代理IP,也可自定义算法获取
  • 去重: 双重去重,默认对URL去重,也可以定义第二层去重逻辑
  • 控制: 可自主控制是否需要解析页面,减少资源的使用
  • 精准: 通过设置URL的正则来精准的解析每一个URL
  • 扩展: 几乎每一个环节都可以自定义

使用

使用Maven

http://search.maven.org上使用最新的版本
在pom中引入

<dependency>
    <groupId>com.github.vector4wang</groupId>
    <artifactId>vw-crawler</artifactId>
    <version>${last.version}</version>
</dependency>

离线使用

可以在项目主页的release下载最新版本jar,然后导入自己的项目中。

步骤

  • 配置参数
  • 抽象正则
  • 解析页面
  • 保存数据

各环节均支持自定义

示例

抓取CSDN某用户的博客内容

设置爬虫的基本配置,如User-Agent、起始地址、目标页面的url正则表达式、线程数和超时时间等

new VWCrawler.Builder()
        // 配置参数
        .setHeader("User-Agent",
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36") // 设置请求头
        .setUrl("https://blog.csdn.net/qqhjqs") // 设置爬虫起始地址
        .setThreadCount(10) // 设置几个线程抓取数据
        .setTimeOut(5000) // 设置超时时间

        // 抽象正则
        .setTargetUrlRex("https://blog.csdn.net/qqhjqs/article/details/[0-9]+") // 设置目标页面url的正则表达式

        // 解析页面
        .setPageParser(new CrawlerService<Blog>() {

            /**
             * 有的url可能在某个场景下不需要可在此处理
             * 默认返回false,可以不做处理
             * @param url 即将要抓取的url
             * @return
             */
            @Override
            public boolean isExist(String url) {
                if ("https://blog.csdn.net/qqhjqs/article/details/79101846".equals(url)) {
                    return true;
                }
                return false;
            }

            /**
             * 有的页面有WAF,可以再真正解析前,做个判断,遇到特殊标志的直接可以跳过
             * 默认返回true,可以不做处理
             * @param document 即将要解析的document
             * @return
             */
            @Override
            public boolean isContinue(Document document) {
                if ("最近和未来要做的事 - CSDN博客".equals(document.title())) {
                    System.out.println("模拟遇到WAF此页面不做解析");
                    return false;
                }
                return true;
            }

            /**
             * 目标页面的doc对象,还有通过注解处理后的对象
             * @param doc 文档内容
             * @param pageObj 封装的对象
             */
            @Override
            public void parsePage(Document doc, Blog pageObj) {
                // 可进行二次处理
                pageObj.setReadNum(pageObj.getReadNum().replace("阅读数:", ""));
            }


            // 保存数据

            /**
             * 可以做保存对象的处理
             * @param pageObj 页面对象
             */
            @Override
            public void save(Blog pageObj) {
                System.out.println("save blog summery: " + pageObj.toString());
            }
        }) // 自定义解析service


        .build().start(); // 启动

配置页面数据对象的注解

@CssSelector(selector = "#mainBox > main > div.blog-content-box > div.article-title-box > h1", resultType = SelectType.TEXT)
private String title;

@CssSelector(selector = "#mainBox > main > div.blog-content-box > div.article-info-box > div > span.time", dateFormat = "yyyy年MM月dd日 HH:mm:ss")
private Date lastUpdateDate;

@CssSelector(selector = "#mainBox > main > div.blog-content-box > div.article-info-box > div > div > span", resultType = SelectType.TEXT)
private String readNum;

这里使用比较流行的注解方式,通过cssselector来获取节点数据可通过resultType来指定填充的是text还是html。

随便配置一下,就能抓取一个页面的数据

new VWCrawler.Builder().setUrl("https://www.qiushibaike.com/").setPageParser(new CrawlerService() {
    @Override
    public void parsePage(Document doc, Object pageObj) {
        System.out.println(doc.toString());
    }

    @Override
    public void save(Object pageObj) {

    }
}).build().start();

更多

更多的示例可移步more

抓取了足够多的数据,我们可以拿数据做很多事,比如统计各大人才网的职位分布图


有关ES的可移步这里

最后

轮子造多了就想着造一个模具,代码写多了就想写个框架,一样的道理。帮助他人,顺便提升自己。框架还有很多需要完善的地方,希望使用者多多提issue,也希望大家提PR~~~
源码
欢迎大家访问~~~

使用SpringBoot和VWCawler轻松抓取CSDN的文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,829评论 1 331
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,603评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,846评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,600评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,780评论 3 272
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,695评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,136评论 2 293
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,862评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,453评论 0 229
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,942评论 2 233
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,347评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,790评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,293评论 3 221
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,839评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,448评论 0 181
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,564评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,623评论 2 249

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    X先生_未知数的X阅读 15,931评论 3 118
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,472评论 25 707
  • 说起腊肉,相信大多数朋友吃过,但做过的人应该就寥寥无几了吧。 腊肉,难做呀! 腊肉多是在腊月做的。为什么呢?第一,...
    秭归橙子格格阅读 975评论 0 11
  • 还记得之前看过一个关于和亲人对视3分钟的视频。有夫妻,有父女,有母女,有兄弟,有姐妹…大家开始都会有不好意思,也会...
    8e0b8093b46f阅读 852评论 4 9
  • 今年9月份,全国就要统一使用部编本小学语文新教材了,主编温儒敏结合老师们比较关心的11个问题,对这套教材做了些说明...
    小幸的平凡生活阅读 1,207评论 1 13