基于Nodejs的爬蟲框架Tai-Spider

鼎鼎大名的Scrapy是基于Python的爬蟲框架影暴,Tai-Spider就是基于Nodejs的Scrapy鹅士,下面我們就來看看這個框架有哪些能力吧。

官方提供了爬蟲示例項目 tai-spider-example隔躲。

安裝

直接使用 npm 或者 yarn 安裝即可

npm install tai-spider

或者

yarn add tai-spider

編寫第一個爬蟲

官方示例采用了和Scrapy一樣的例子扛稽,即在spider目錄下創(chuàng)建quotes.js浮驳,該爬蟲繼承了TaiSpider,其代碼如下所示:

'use strict'

const { TaiSpider, ItemLoader } = require('tai-spider');

class QuotesSpider extends TaiSpider {

    constructor(options = {}) {
        super(options);
        this.name = 'quotes';
        this.debug = true;
        this.start_urls = [
            'https://quotes.toscrape.com/page/1/',
        ];
    }

    *parse(response) {
        for (let ele of response.css('div.quote')) {
            yield {
                'text': response.css('span.text', ele).text(),
            };
        }
    }
}

module.exports = QuotesSpider;

在這個例子里 QuotesSpider 作為 TaiSpider 的子類捞魁,定義并實現(xiàn)了一些屬性和方法:

  • name:用于標識spider至会,它在項目中必須是唯一的,也就是說谱俭,不能為不同的spider設(shè)置相同的名稱奉件。

  • start_urls:起始urls,后續(xù)請求將從這些初始請求連續(xù)生成昆著。

  • parse():該方法將被調(diào)用來處理每個請求下載的響應(yīng)县貌,response參數(shù)是Response類的一個實例,它提供了一些便利的方法來處理頁面元素凑懂。parse方法通常用于解析響應(yīng)煤痕,將抓取的數(shù)據(jù)提取為json對象、查找要跟蹤的新URL接谨,并從中創(chuàng)建新請求摆碉。

運行Spider

為了運行剛剛編寫好的spider,你需要進入項目的頂層目錄脓豪,并執(zhí)行如下命令:

taispider run quotes

這個命令將運行我們剛剛編寫的名為 quotes 的爬蟲巷帝,它將向 quotes.toscrape.com 發(fā)送一些請求,我們可以得到類似下面的輸出:

run spider: quotes
start url: https://quotes.toscrape.com/page/1/
[2021-11-06T09:31:44.570] [DEBUG] taispider - seenreq is initialized.
[2021-11-06T09:31:46.991] [DEBUG] taispider - connect to a new https://quotes.toscrape.com
[2021-11-06T09:31:48.027] [DEBUG] taispider - Http2 session https://quotes.toscrape.com connection init
[2021-11-06T09:31:48.675] [DEBUG] taispider - https://quotes.toscrape.com/page/1/ stream ends
[2021-11-06T09:31:48.676] [DEBUG] taispider - Got https://quotes.toscrape.com/page/1/ (11053 bytes)...
[2021-11-06T09:31:48.694] [DEBUG] taispider - Queue size: 0

parse 方法中你可以通過css表達式來對HTML元素進行選取扫夜,具體的css表達式規(guī)則可以參考 cheerio.

你也可以將抓取到的數(shù)據(jù)保存到文件中而不是打印到屏幕上楞泼,你只需要加上如下的命令行參數(shù)即可:

taispider run quotes -o result.jl

遞歸抓取頁面中的鏈接

parse() 方法不僅用于抓取頁面中的數(shù)據(jù)驰徊,還可以獲取下一步抓取的鏈接《槔可以使用 follow 或者 follow_all 生成新的抓取請求棍厂,同時還允許你為這個請求指定新的回調(diào)處理函數(shù)。

在下面這個例子中印蔬,就創(chuàng)建了一個名為 parseAuthor 的新方法來處理新的author頁面:

'use strict'

const { TaiSpider, ItemLoader } = require('tai-spider');

class QuotesSpider extends TaiSpider {

    constructor(options = {}) {
        super(options);
        this.name = 'quotes';
        this.debug = true;
        this.start_urls = [
            'https://quotes.toscrape.com/page/1/',
        ];
    }

    *parse(response) {
        for (let ele of response.css('div.quote')) {
            yield {
                'text': response.css('span.text', ele).text(),
            };
            yield* response.follow_all(response.css('span a', ele), this.parseAuthor);
        }
    }

    *parseAuthor(response) {
        const extract_with_css = (query) => {
            return _.trim(response.css(query).text());
        }

        yield {
            'name': extract_with_css('h3.author-title'),
            'birthdate': extract_with_css('.author-born-date'),
            'bio': extract_with_css('.author-description'),
        }
    }

}

module.exports = QuotesSpider;

使用model

在parse方法中除了可以直接使用json對象勋桶,也可以使用 ItemLoader 來簡化數(shù)據(jù)的抽取,通過預(yù)先定義好model侥猬,你就可以簡單地僅使用 load_item 方法就可以完成數(shù)據(jù)的抽取例驹。

    *parseAuthor(response) {
        const loader = new ItemLoader(response, require('../model/author'));
        yield loader.load_item();
    }

model/author.js

const Item = require('tai-spider').Item;

module.exports = new Item({
    name: 'h3.author-title',
    birthdate: {
        value: '.author-born-date',
        type: 'date',
    },
    bio: '.author-description',
});

下載圖片文件

有時我們需要下載大量的圖片文件,使用 TaiSpider 框架退唠,可以僅僅通過設(shè)置幾個簡單的屬性就可以完成圖片文件的下載鹃锈。

  • IMAGES_STORE 用于指定輸出路徑
  • Image 對象用于指定輸出圖片的屬性,包括 url, type, filenamebody

如果沒有給出 filename 屬性瞧预,框架會自動根據(jù) url 生成MD5值來作為文件名屎债。

'use strict'

const { TaiSpider } = require('tai-spider');
const { Image } = require('tai-spider').types;

class ImageSpider extends TaiSpider {

    constructor(options = {}) {
        super(options);
        this.name = 'image';
        this.debug = true;
        this.start_urls = [
            'https://www.mmonly.cc/gxtp/',
        ];
        this.envs['ECHO'] = false;
        this.envs['IMAGES_STORE'] = 'output';
    }

    *parse(response) {
        for (let ele of response.css('div.item')) {
            let imageEle = response.css('img', ele)[0];
            yield response.follow(imageEle.attribs['src'], this.parseImage, { filename: imageEle.attribs['alt'] + '.jpg' });
        }
    }

    *parseImage(response) {
        yield new Image({
            url: response.options.uri,
            type: 'jpg',
            filename: response.options.filename,
            body: response.body,
        });
    }
}

module.exports = ImageSpider;

執(zhí)行上述爬蟲,你就可以在 output 目錄下得到所有下載的圖片文件垢油。

這么好的爬蟲框架盆驹,趕緊開始用起來吧,Github地址在這里: Tai-Spider

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末滩愁,一起剝皮案震驚了整個濱河市躯喇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌硝枉,老刑警劉巖廉丽,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異妻味,居然都是意外死亡正压,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門责球,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焦履,“玉大人,你說我怎么就攤上這事棕诵〔昧迹” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵校套,是天一觀的道長价脾。 經(jīng)常有香客問我,道長笛匙,這世上最難降的妖魔是什么侨把? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任犀变,我火速辦了婚禮,結(jié)果婚禮上秋柄,老公的妹妹穿的比我還像新娘获枝。我一直安慰自己,他們只是感情好骇笔,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布省店。 她就那樣靜靜地躺著,像睡著了一般笨触。 火紅的嫁衣襯著肌膚如雪懦傍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天芦劣,我揣著相機與錄音粗俱,去河邊找鬼。 笑死虚吟,一個胖子當著我的面吹牛寸认,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播串慰,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼偏塞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了邦鲫?” 一聲冷哼從身側(cè)響起烛愧,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掂碱,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慎冤,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡疼燥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蚁堤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片醉者。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖披诗,靈堂內(nèi)的尸體忽然破棺而出撬即,到底是詐尸還是另有隱情,我是刑警寧澤呈队,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布剥槐,位于F島的核電站,受9級特大地震影響宪摧,放射性物質(zhì)發(fā)生泄漏粒竖。R本人自食惡果不足惜颅崩,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蕊苗。 院中可真熱鬧沿后,春花似錦、人聲如沸朽砰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞧柔。三九已至漆弄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間非剃,已是汗流浹背置逻。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留备绽,地道東北人券坞。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像肺素,于是被迫代替她去往敵國和親恨锚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

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

  • Scrapy 框架 (本文僅用作個人記錄) - Scrapy框架是用純python實現(xiàn)一個為了爬去網(wǎng)站數(shù)據(jù)倍靡,提取結(jié)...
    wwxxee閱讀 832評論 0 3
  • 1.框架架構(gòu)圖: 2.各文件功能 scrapy.cfg 項目的配置文件items.py 定義了Item數(shù)據(jù)結(jié)構(gòu)猴伶,...
    朝畫夕拾閱讀 296評論 0 0
  • 目錄 參考 概述 安裝 編寫scrapy程序 問題總結(jié) 1. 參考 [1] docs.scrapy.org/en/...
    smallest_one閱讀 731評論 0 6
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險厭惡者,不喜歡去冒險塌西,但是人生放棄了冒險他挎,也就放棄了無數(shù)的可能。 ...
    yichen大刀閱讀 6,041評論 0 4
  • 公元:2019年11月28日19時42分農(nóng)歷:二零一九年 十一月 初三日 戌時干支:己亥乙亥己巳甲戌當月節(jié)氣:立冬...
    石放閱讀 6,876評論 0 2