WebMagic學(xué)習(xí)(一)之Hello world

Java爬蟲項(xiàng)目簡介

大型的:

Nutch apache/nutch · GitHub
apache下的開源爬蟲程序慰枕,功能豐富,文檔完整。有數(shù)據(jù)抓取解析以及存儲(chǔ)的模塊。適合做搜索引擎以政,分布式爬蟲是其中一個(gè)功能。

Heritrix internetarchive/heritrix3 · GitHub
比較成熟的爬蟲伴找。經(jīng)歷過很多次更新盈蛮,使用的人比較多,功能齊全技矮,文檔完整抖誉,網(wǎng)上的資料也多。有自己的web管理控制臺(tái)穆役,包含了一個(gè)HTTP 服務(wù)器寸五。操作者可以通過選擇Crawler命令來操作控制臺(tái)梳凛。

小型的:

Crawler4j yasserg/crawler4j · GitHub
因?yàn)橹粨碛信老x的核心功能耿币,所以上手極為簡單,幾分鐘就可以寫一個(gè)多線程爬蟲程序

WebCollector CrawlScript/WebCollector · GitHub(國人作品)
目標(biāo)是在讓你在5分鐘之內(nèi)寫好一個(gè)爬蟲韧拒。參考了crawler4j淹接,如果經(jīng)常需要寫爬蟲,需要寫很多爬蟲叛溢,還是不錯(cuò)的塑悼,因?yàn)樯鲜挚隙ú恢?分鐘。缺點(diǎn)是它的定制性不強(qiáng)楷掉。

WebMagic code4craft/webmagic · GitHub(國人作品厢蒜,推薦)
垂直、全棧式烹植、模塊化爬蟲斑鸦。更加適合抓取特定領(lǐng)域的信息。它包含了下載草雕、調(diào)度巷屿、持久化、處理頁面等模塊墩虹。每一個(gè)模塊你都可以自己去實(shí)現(xiàn)嘱巾,也可以選擇它已經(jīng)幫你實(shí)現(xiàn)好的方案。這就有了很強(qiáng)的定制性诫钓。

WebMagic初探

WebMagic的結(jié)構(gòu)分為Downloader旬昭、PageProcessor、Scheduler菌湃、Pipeline四大組件问拘,并由Spider將它們彼此組織起來。更多信息可見 http://webmagic.io/docs

WebMagic

第一個(gè)爬蟲項(xiàng)目

爬取干貨集中營的歷史數(shù)據(jù)為例子

  • 使用maven來構(gòu)建項(xiàng)目,pom配置
<dependency>
    <groupId>us.codecraft</groupId>
    <artifactId>webmagic-core</artifactId>
    <version>0.6.1</version>
</dependency>
<dependency>
    <groupId>us.codecraft</groupId>
    <artifactId>webmagic-extension</artifactId>
    <version>0.6.1</version>
</dependency>

代碼如下:

package com.sima.crawler;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.ConsolePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
/**
 * Created by maple on 2017-04-28.
 */
public class GankRepoPageProcessor implements PageProcessor {
    //抓取網(wǎng)站的相關(guān)配置场梆,包括編碼墅冷、抓取間隔、重試次數(shù)等
    private Site site = Site.me().setRetryTimes(3).setSleepTime(100);

    // process是定制爬蟲邏輯的核心接口或油,在這里編寫抽取邏輯
    public void process(Page page) {
        //定義如何抽取頁面信息
        //爬取干貨集中營歷史數(shù)據(jù)寞忿,http://gank.io/2017/04/26
        page.addTargetRequests(page.getHtml().links().regex("(http://gank\\.io/\\d+/\\d+/\\d+)").all());
        page.putField("title", page.getHtml().$("h1").toString());//獲取標(biāo)題
        page.putField("content", page.getHtml().$("div.outlink").toString());//獲取頁面內(nèi)容

       if (page.getResultItems().get("title") == null) {
            //跳過沒有數(shù)據(jù)的頁面
            page.setSkip(true);
        }
    }

    public Site getSite() {
        return site;
    }

    public static void main(String[] args) {
        Spider.create(new GankRepoPageProcessor())
                .addUrl("http://gank.io")//從該url開始
                .addPipeline(new ConsolePipeline())
                .thread(5)
                .run();
    }
}

運(yùn)行結(jié)果如下:

運(yùn)行結(jié)果截圖
頁面元素的抽取說明

對(duì)于下載到的Html頁面,如何從中抽取到想要的信息顶岸?WebMagic里主要使用了三種抽取技術(shù):XPath腔彰、正則表達(dá)式和CSS選擇器。另外辖佣,對(duì)于JSON格式的內(nèi)容霹抛,可使用JsonPath進(jìn)行解析。

  • XPath
    XPath 是一門在 XML 文檔中查找信息的語言卷谈。XPath 可用來在 XML 文檔中對(duì)元素和屬性進(jìn)行遍歷杯拐。用于Html也是比較方便的。例如:
page.putField("title", page.getHtml().xpath("http://div[@class='blog-heading']/div[@class='title']/text()").toString());

該語句的意思“查找所有Class屬性為‘blog-heading’的div世蔗,并找它的div子節(jié)點(diǎn)(Class屬性為‘blog-title’)端逼,提取該子節(jié)點(diǎn)的文本信息”

  • CSS選擇器
    在 CSS 中,選擇器是一種模式污淋,用于選擇需要添加樣式的元素顶滩。
page.putField("content", page.getHtml().$("div.outlink").toString());

該語句的意思“查找所有Class屬性為‘outlink’的div”

  • 正則表達(dá)式
    正則表達(dá)式是一種特殊的字符串模式,用于匹配一組字符串寸爆,就好比用模具做產(chǎn)品礁鲁,而正則就是這個(gè)模具,定義一種規(guī)則去匹配符合規(guī)則的字符赁豆。
 page.addTargetRequests(page.getHtml().links().regex("(http://gank\\.io/\\d+/\\d+/\\d+)").all());
  • JsonPath
    JsonPath是于XPath很類似的一個(gè)語言仅醇,它用于從Json中快速定位一條內(nèi)容。WebMagic中使用的JsonPath格式可以參考這里:https://code.google.com/p/json-path/

鏈接的發(fā)現(xiàn)

一個(gè)站點(diǎn)的頁面是很多的歌憨,一開始我們不可能全部列舉出來着憨,如何發(fā)現(xiàn)后續(xù)的鏈接?

 page.addTargetRequests(page.getHtml().links().regex("(http://gank\\.io/\\d+/\\d+/\\d+)").all());

這段代碼的分為兩部分,page.getHtml().links().regex("(http: //gank\.io/\d+/\d+/\d+)").all()用于獲取所有滿足"(http: //gank\.io/\d+/\d+/\d+)"這個(gè)正則表達(dá)式的鏈接务嫡,page.addTargetRequests()則將這些鏈接加入到待抓取的隊(duì)列中去甲抖。即可完成對(duì)該站點(diǎn)的頁面爬取。

附上項(xiàng)目工程截圖
項(xiàng)目結(jié)構(gòu)圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末心铃,一起剝皮案震驚了整個(gè)濱河市准谚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌去扣,老刑警劉巖柱衔,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件樊破,死亡現(xiàn)場離奇詭異,居然都是意外死亡唆铐,警方通過查閱死者的電腦和手機(jī)哲戚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來艾岂,“玉大人顺少,你說我怎么就攤上這事⊥踉。” “怎么了脆炎?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長氓辣。 經(jīng)常有香客問我秒裕,道長,這世上最難降的妖魔是什么钞啸? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任几蜻,我火速辦了婚禮,結(jié)果婚禮上爽撒,老公的妹妹穿的比我還像新娘入蛆。我一直安慰自己响蓉,他們只是感情好硕勿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枫甲,像睡著了一般源武。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上想幻,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天粱栖,我揣著相機(jī)與錄音,去河邊找鬼脏毯。 笑死闹究,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的食店。 我是一名探鬼主播渣淤,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吉嫩!你這毒婦竟也來了价认?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤自娩,失蹤者是張志新(化名)和其女友劉穎用踩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脐彩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年碎乃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惠奸。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荠锭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晨川,到底是詐尸還是另有隱情证九,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布共虑,位于F島的核電站愧怜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏妈拌。R本人自食惡果不足惜拥坛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尘分。 院中可真熱鬧猜惋,春花似錦、人聲如沸培愁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽定续。三九已至谍咆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間私股,已是汗流浹背摹察。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留倡鲸,地道東北人供嚎。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像峭状,于是被迫代替她去往敵國和親克滴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,515評(píng)論 25 707
  • 聲明:本文講解的實(shí)戰(zhàn)內(nèi)容宁炫,均僅用于學(xué)習(xí)交流偿曙,請(qǐng)勿用于任何商業(yè)用途! 一羔巢、前言 強(qiáng)烈建議:請(qǐng)?jiān)陔娔X的陪同下望忆,閱讀本文...
    Bruce_Szh閱讀 12,679評(píng)論 6 28
  • 1 前言 作為一名合格的數(shù)據(jù)分析師罩阵,其完整的技術(shù)知識(shí)體系必須貫穿數(shù)據(jù)獲取、數(shù)據(jù)存儲(chǔ)启摄、數(shù)據(jù)提取稿壁、數(shù)據(jù)分析、數(shù)據(jù)挖掘歉备、...
    whenif閱讀 18,052評(píng)論 45 523
  • 如果人類的數(shù)量減少一半傅是,被燒毀森林面積將減少一半吧。 人類的數(shù)量若僅剩下百分之一蕾羊,那么排放出垃圾的量喧笔,也將會(huì)變成百...
    一抔土WW閱讀 1,617評(píng)論 0 3
  • 目前淘寶70%的交易都發(fā)生在手淘上书闸,手淘的私人化和移動(dòng)化更適合購物場景,如何取得手淘流量就成了諸多商家首先需要考慮...
    船長辛巴達(dá)閱讀 512評(píng)論 0 0