使用nodejs 批量下载虾米音乐的 方法。
使用到的工具 fs,cheerio,request,redis;
模块 | 作用 |
---|---|
fs | 主要完成建立目录和文件的功能 |
request | 用于进行访问url |
cheerio | 页面解析 |
redis | 使用数据库存储歌手的信息,持久化,也可不要,使用数组,看个人需求。 |
主要分为以下几个步骤。
1.输入你想要的歌手的名字
2.搜索歌手的专辑
3访问专辑页面
4获取专辑里歌曲id
5获取歌曲id对应的真实下载url。
首先1 完成下载某一首歌曲的功能。给定下载的歌名,歌曲id,歌手,下载路径
function download(songname,songid,singer,dir) {
var requesturl = getSongUrl(songid);
if(requesturl){
request(requesturl, function (req, res, err) {
var body;
if (res) {
var $ = cheerio.load(res.body, {xmlMode: true});
var urlstr = $('location').text();
if(urlstr){
var songUrl = decodeUrl(urlstr);
var path = dir+songname.trim().replace('\/','_') + '_' + singer + '.mp3';
fs.access(path, function (err) {
if (err) {
if(songUrl) {
console.log("正在下载"+songname);
request(songUrl).pipe(fs.createWriteStream(path)).on('end',function(err){
console(err?songname+'下载失败':songname+"下载成功");
});
}
}
});
}else{
console.log(songname+'无法下载');
}
}
else {
console.log(songname+'没有下载权限');
}
})
}
}
2 完成下载专辑和图片的功能,使用request(url).pipe(stream)即可
function downloadAlbum(picurl,albumurl,albumname,singer){
var basedir = './'+singer;
var dir = basedir+'/'+albumname+'/';
var picname = albumname+'.jpg';
fs.access(basedir,function(err){
if(err){
fs.mkdir(basedir,function(err){
fs.access(dir,function(err){
if(err){
fs.mkdir(dir,function(err){
downloadCoverAndSongs(picurl,albumurl,dir,singer);
})
}else{
downloadCoverAndSongs(picurl,albumurl,dir,singer);
}
});
});
}else{
fs.access(dir,function(err){
if(err){
fs.mkdir(dir,function(err){
downloadCoverAndSongs(picurl,albumurl,dir,picname,singer);
})
}else{
downloadCoverAndSongs(picurl,albumurl,dir,picname,singer);
}
})
}
});
}
function downloadCoverAndSongs(picurl,albumurl,dir,picname,singer){
request(picurl).pipe(fs.createWriteStream(dir+picname));
request(albumurl,function(req,res,err){
if(res) {
var $ = cheerio.load(res.body, {decodeEntities: false});
var songstable = $('#track_list tr[data-needpay]');
if(songstable){
for(var i in songstable){
var song = songstable.eq(i).find('td.song_name a:first-child');
if(song.text()){
var songid = song.attr('href').slice(6</