鼎鼎大名的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
,filename
和body
如果沒有給出 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