node爬取网易云歌曲

起因:老爸让我下载几千首歌曲给他在车上播放,感觉手动下载,就算批量下载也要时间,索性写个爬虫自动下载吧。。
对于这个爬虫小项目,选择了node+koa2,初始化项目koa2 projectName(需要先全局安装koa-generator),然后进入项目文件,npm install && npm start,其中依赖用到了superagent, cheerio, async, fs, path
打开网易云网页版,点击歌单页面,我选择了华语分类,右键查看框架源码,获取真实url,找到id为m-pl-container的html结构,这就是这次需要爬取的歌单列表,直接用superagent请求url,只能爬取到第一页的数据,需要async来并发爬取
static getPlayList(){
const pageUrlList = this.getPageUrl();

return new Promise((resolve, reject) => {
	asy.mapLimit(pageUrlList, 1, (url, callback) => {
		this.requestPlayList(url, callback);
	}, (err, result) => {
		if(err){
			reject(err);
		}

		resolve(result);
	})
})

}
复制代码其中const asy = require(‘async’),因为用到async/await,所以区分下,requestPlayList是superagent发起的请求
static requestPlayList(url, callback){
superagent.get(url).set({
‘Connection’: ‘keep-alive’
}).end((err, res) => {
if(err){
console.info(err);
callback(null, null);
return;
}

	const $ = cheerio.load(res.text);
	let curList = this.getCurPalyList($);
	callback(null, curList);  
})

}
复制代码getCurPalyList是获取页面上的信息,传入 用 于 d o m 操 作 s t a t i c g e t C u r P a l y L i s t ( 用于dom操作 static getCurPalyList( domstaticgetCurPalyList(){
let list = [];

$('#m-pl-container li').each(function(i, elem){
	let _this = $(elem);
	list.push({
		name: _this.find('.dec a').text(),
		href: _this.find('.dec a').attr('href'),
		number: _this.find('.nb').text()
	});
});

return list;

}
复制代码至此,歌单列表爬取完成,接下来要爬取歌曲列表
static async getSongList(){
const urlCollection = await playList.getPlayList();

let urlList = [];
for(let item of urlCollection){
	for(let subItem of item){
		urlList.push(baseUrl + subItem.href);
	}
}

return new Promise((resolve, reject) => {
	asy.mapLimit(urlList, 1, (url, callback) => {
		this.requestSongList(url, callback);
	}, (err, result) => {
		if(err){
			reject(err);
		}

		resolve(result);
	})
})

}
复制代码requestSongList的使用跟上面playList的差不多,因此不再重复。上面代码获取到歌曲列表后,需要下载到本地
static async downloadSongList(){
const songList = await this.getSongList();

let songUrlList = [];
for(let item of songList){
	for(let subItem of item){
		let id = subItem.url.split('=')[1];
		songUrlList.push({
			name: subItem.name,
			downloadUrl: downloadUrl + '?id=' + id + '.mp3'
		});
	}
}

if(!fs.existsSync(dirname)){
	fs.mkdirSync(dirname);
}

return new Promise((resolve, reject) => {
	asy.mapSeries(songUrlList, (item, callback) => {
		setTimeout(() => {
			this.requestDownload(item, callback);
			callback(null, item);
		}, 5e3);
	}, (err, result) => {
		if(err){
			reject(err);
		}

		resolve(result);
	})
})

}
复制代码其中requestDownload是请求downloadUrl并下载保存到本地
static requestDownload(item, callback){
let stream = fs.createWriteStream(path.join(dirname, item.name + ‘.mp3’));

superagent.get(item.downloadUrl).set({
	'Connection': 'keep-alive'
}).pipe(stream).on('error', (err) => {
	console.info(err);   // error处理,爬取错误时,打印错误并继续向下执行
})

}
复制代码到此,爬虫小程序完成。该项目爬取歌单列表–>歌曲列表–>下载到本地,当然也可以直接找到某位歌手的主页,修改传入songList的url,直接下载该歌手的热门歌曲。

顺便推广下自己的两个小说网站,喜欢的朋友可以收藏下!
虫鱼小说网
知秋小说网

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值