一套簡單的java爬蟲框架VW-Crawler發(fā)布啦S缇印D浦痢!

VW-Crawler

背景

自己一直對爬蟲比較感興趣胎源,大學的畢業(yè)論文也是一個爬蟲項目(爬教務處信息棉钧,然后做了個Android版教務管理系統(tǒng),還獲得了優(yōu)秀畢業(yè)設計的稱號)涕蚤,自那以后遇到自己感興趣的網站就會去抓一下宪卿。前段時間工作上需要一些JD信息,我就從網上找了個開源的爬蟲框架WebMagic万栅,使用簡單佑钾,易配置,功能也很強大烦粒,當然了也有些網站的數據不適合使用休溶。前前后后寫了不下十幾個,慢慢的就想是不是可以把這些爬蟲代碼再抽象出來扰她,做出一個簡易的爬蟲框架呢兽掰?于是就嘗試去看WebMagic的源碼,后來又發(fā)現了一個源碼比較容易解讀的爬蟲框架XXL-CRAWLER,簡單的分析了源碼之后徒役,開發(fā)自己一套爬蟲框架的欲望更加強烈,于是在2017年底的時候就開始了開發(fā)孽尽,中間斷斷續(xù)續(xù)得停了寫,寫了停忧勿。直到最近8月底的時候才算出了一個版本杉女,然后順勢把它放到了Maven公服倉庫上瞻讽。一個人的力量很薄弱,要想完善這個爬蟲的健壯性熏挎、可用性和易擴展性還需要大家的力量速勇!

特點

  • 語言: Java開發(fā),框架比較簡單婆瓜,多處使用的是接口編程快集,是學習Java不錯的例子
  • 難度: 及其簡單,配置一下廉白,寫個解析邏輯个初,整理下保存方法,就OK了
  • 輕量: 使用Jsoup做默認的下載器猴蹂,依賴性較低
  • 線程: 可自主設置線程數抓取院溺,提高抓取效率
  • 重試: 支持失敗重試,次數可以自定義
  • 代理: 支持配置代理池磅轻,默認隨機使用代理IP珍逸,也可自定義算法獲取
  • 去重: 雙重去重,默認對URL去重聋溜,也可以定義第二層去重邏輯
  • 控制: 可自主控制是否需要解析頁面谆膳,減少資源的使用
  • 精準: 通過設置URL的正則來精準的解析每一個URL
  • 擴展: 幾乎每一個環(huán)節(jié)都可以自定義

使用

使用Maven

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

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

離線使用

可以在項目主頁的release下載最新版本jar,然后導入自己的項目中撮躁。

步驟

  • 配置參數
  • 抽象正則
  • 解析頁面
  • 保存數據

各環(huán)節(jié)均支持自定義

示例

抓取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來獲取節(jié)點數據可通過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

抓取了足夠多的數據,我們可以拿數據做很多事冤荆,比如統(tǒng)計各大人才網的職位分布圖


有關ES的可移步這里

最后

輪子造多了就想著造一個模具,代碼寫多了就想寫個框架权纤,一樣的道理钓简。幫助他人乌妒,順便提升自己⊥獾耍框架還有很多需要完善的地方撤蚊,希望使用者多多提issue,也希望大家提PR~~~
源碼
歡迎大家訪問~~~

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末损话,一起剝皮案震驚了整個濱河市侦啸,隨后出現的幾起案子,更是在濱河造成了極大的恐慌丧枪,老刑警劉巖光涂,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異拧烦,居然都是意外死亡忘闻,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門恋博,熙熙樓的掌柜王于貴愁眉苦臉地迎上來齐佳,“玉大人拨齐,你說我怎么就攤上這事障贸。” “怎么了扁眯?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵疫衩,是天一觀的道長硅蹦。 經常有香客問我,道長隧土,這世上最難降的妖魔是什么提针? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮曹傀,結果婚禮上辐脖,老公的妹妹穿的比我還像新娘。我一直安慰自己皆愉,他們只是感情好嗜价,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著幕庐,像睡著了一般久锥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上异剥,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天瑟由,我揣著相機與錄音,去河邊找鬼冤寿。 笑死歹苦,一個胖子當著我的面吹牛青伤,可吹牛的內容都是我干的。 我是一名探鬼主播殴瘦,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼狠角,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蚪腋?” 一聲冷哼從身側響起丰歌,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屉凯,沒想到半個月后立帖,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡神得,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年厘惦,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哩簿。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡宵蕉,死狀恐怖,靈堂內的尸體忽然破棺而出节榜,到底是詐尸還是另有隱情羡玛,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布宗苍,位于F島的核電站稼稿,受9級特大地震影響,放射性物質發(fā)生泄漏讳窟。R本人自食惡果不足惜让歼,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丽啡。 院中可真熱鬧谋右,春花似錦、人聲如沸补箍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坑雅。三九已至辈挂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間裹粤,已是汗流浹背终蒂。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人后豫。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓悉尾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親挫酿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內容

  • 1愕难、通過CocoaPods安裝項目名稱項目信息 AFNetworking網絡請求組件 FMDB本地數據庫組件 SD...
    陽明先生_x閱讀 15,968評論 3 119
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,515評論 25 707
  • 說起臘肉早龟,相信大多數朋友吃過,但做過的人應該就寥寥無幾了吧猫缭。 臘肉葱弟,難做呀! 臘肉多是在臘月做的猜丹。為什么呢芝加?第一,...
    秭歸橙子和水果閱讀 1,019評論 0 11
  • 還記得之前看過一個關于和親人對視3分鐘的視頻蝌麸。有夫妻,有父女艾疟,有母女来吩,有兄弟,有姐妹…大家開始都會有不好意思蔽莱,也會...
    8e0b8093b46f閱讀 880評論 4 9
  • 今年9月份弟疆,全國就要統(tǒng)一使用部編本小學語文新教材了,主編溫儒敏結合老師們比較關心的11個問題盗冷,對這套教材做了些說明...
    小幸的平凡生活閱讀 1,241評論 1 13