Nodejs爬取酷狗音乐歌曲

利用Node.js的核心模块path和fs模块,以及第三方模块cheerio模块和请求模块request爬取酷狗音乐的详细歌手的歌曲。详细的思路如下:

1.酷狗音乐的搜索页面地址:如周杰伦的详细歌单 http://www.kugou.com/yy/html/search.html#searchType=song&searchKeyWord=周杰伦
  • 你可以在Node.js中读取命令行输入的参数(歌手的名字),然后把参数拼接到搜索的网址,然后请求响应的歌手详细页面。
2.获取歌手详细的地址:http://www.kugou.com/yy/singer/home/3060.html
  • 关于这个歌手详细地址的搜索页面里面的a标签的值;
3.在歌手详细地址的页面可以看到歌手的每一条单曲;审查元素可以看到的一条标签如下:
<input class='cb song_hid' value='薛之谦 - 丑八怪|2688ADB1CA449448388270987BDCE6E8|253000 '/>
  • 这个value值中的hash值是唯一可以确定歌手单曲的详细地址的,因为酷狗音乐已经把地址加密了,如果要知道hash的算法由来只有抓包分析其中的参数以及加密步骤;现在我们已经取巧了,直接通过js的正则的表达式来窃取中间这一段hash值,也是爬取酷狗音乐的关键步骤之一。
4. 把hash值拼接起来批量抓取歌曲;通过chrome浏览器的抓包分析可以看到歌曲的请求是异步获取的;请求的地址是http://www.kugou.com/yy/index.php?r=play/getdata&hash=928BA6597476E1D9DF06EA425CE43131&album_id=1747549&_=1495258259290
  • 其中有四个参数是传的,参数是:
let options={
  r=play/getdata,
  _=new Date().getTime(),
  album_id=0,
  hash=2688ADB1CA449448388270987BDCE6E8
};

  • 请求获取到的json格式的数据如下所示,其中的paly_url字段是我们需要获取的值:
{
  "status": 1,
  "err_code": 0,
  "data": {
    "hash": "928BA6597476E1D9DF06EA425CE43131",
    "timelength": 305000,
    "filesize": 4884733,
    "audio_name": "薛之谦 - 下雨了",
    "have_album": 1,
    "album_name": "初学者",
    "album_id": "1747549",
    "img": "http://imge.kugou.com/stdmusic/20160718/20160718092740664264.jpg",
    "have_mv": 1,
    "video_id": "181461",
    "author_name": "薛之谦",
    "song_name": "下雨了",
    "lyrics": "[00:00.11]薛之谦 - 下雨了\r\n[00:01.87]词:薛之谦\r\n[00:02.70]曲:薛之谦\r\n[00:03.53]编曲:张宝宇\r\n[00:04.43]制作人:赵英俊\r\n[00:05.45]配唱制作人:赵英俊\r\n[00:06.78]录音师:王晓海\r\n[00:07.80]混音师:鲍锐\r\n[00:08.74]母带处理工程师:鲍锐\r\n[00:20.30]偷偷的下雨的时候月亮偷偷的\r\n[00:30.97]慢慢的街上的人群慢慢安静了\r\n[00:41.59]我在想你可以不必掩饰了\r\n[00:51.79]那雨会停的就随你去了\r\n[01:01.05]雨还在下像在说话\r\n[01:06.29]他敲我的窗叮叮当当\r\n[01:13.92]恋爱的季节勉强不如放下\r\n[01:22.42]雨还在下你听得见吗\r\n[01:27.78]是我的思念滴滴答答\r\n[01:35.53]滴入你的心就会想起我\r\n[01:43.78]雨还在下像在寻你\r\n[01:49.07]它敲我的窗说找不到你\r\n[01:56.70]这样的季节就会特别想你\r\n[02:05.08]雨还在下你仔细听啊\r\n[02:10.32]是我的思念滴滴答答\r\n[02:18.12]滴入你的心告诉你我在想你\r\n[02:46.79]远远的无关的人不经意逃避着\r\n[02:57.31]轻轻的像不像话题被谁提起了\r\n[03:07.17]怎么会没人记得是不是我疯了\r\n[03:18.38]那雨别停了能否算爱着\r\n[03:27.75]雨还在下像在说话\r\n[03:33.04]他敲我的窗叮叮当当\r\n[03:40.62]恋爱的季节勉强不如放下\r\n[03:49.03]雨还在下你听得见吗\r\n[03:54.31]是我的思念滴滴答答\r\n[04:01.88]滴入你的心就会想起我\r\n[04:10.37]雨还在下像在寻你\r\n[04:15.63]它敲我的窗说找不到你\r\n[04:23.44]这样的季节就会特别想你\r\n[04:31.77]雨还在下你仔细听啊\r\n[04:37.05]是我的思念滴滴答答\r\n[04:44.49]还能去屋檐下等你吗\r\n",
    "author_id": "3060",
    "privilege": 0,
    "privilege2": "0",
    "play_url": "http://fs.web.kugou.com/c939235ce25f0002481e782e24e6f39c/591fcef1/G065/M01/02/14/IZQEAFeEyVmAYtKaAEqI_eQvOtA748.mp3",
    "authors": [
      {
        "is_publish": "1",
        "author_id": "3060",
        "avatar": "20170515114300444.jpg",
        "author_name": "薛之谦"
      }
    ],
    "bitrate": 128
  }
}
5.详细的代码如下:
 
var request = require('request');
var cheerio = require('cheerio');
var path = require('path');
var fs = require('fs');
var requrl="http://www.kugou.com/singer/420.html";
var listUrl=new Array();
var filenames=new Array();
request(requrl, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            acquireData(body);
        }
        for(let i=0;i<listUrl.length;i++){
           let time=new Date().getTime();
           request('http://www.kugou.com/yy/index.php?r=play/getdata&hash='+listUrl[i]+'&album_id=0'+'&_='+time, function (error, response, body) {
                if (!error && response.statusCode == 200) {
                    acquireMusic(body,i);
                }
            });
        }

 });
function acquireData(data) {
    var $ = cheerio.load(data);
    var songlist = $('#song_container input').toArray();
    for(let i=0;i<songlist.length;i++){
        let info=songlist[i].attribs.value;
        let reg=/\|/;
        let hash=new Array();
        hash=info.split(reg);
        listUrl.push(hash[1]);
        filenames.push(hash[0]);

    }
   
}
function acquireMusic(data,Num){
    var info=JSON.parse(data);
    var imgsrc=info.data.play_url;
    // var filename = parseUrlForFileName(imgsrc);
    var filename=filenames[Num];
    downloadImg(imgsrc,filename,function(){
        console.log(filename + ' done');
    });
}
 
function parseUrlForFileName(address) {
    var filename = path.basename(address);
    return filename;
}
var downloadImg = function(uri, filename, callback){
    request.head(uri, function(err, res, body){
    if (err) {
        console.log('err: '+ err);
        return false;
    }
    console.log('res: '+ res);
    request(uri).pipe(fs.createWriteStream('images/'+filename+'.mp3')).on('close', callback);  //调用request的管道来下载到 images文件夹下
    });
};
  • 总结:酷狗音乐的歌曲已经爬取成功;酷狗音乐的web端只给出了歌手的三十首的歌曲;如果想获取更多歌曲可以直接下载酷狗客户端然后抓包分析;至于网易云音乐的下载;已经有高手完整地总结出API外链了;作者也曾经研究过网易云的抓取;网易云音乐的获取json格式的post请求参数已经进行了加密;可以网上搜索网易云音乐加密的方法;相类似的请求方法,下面给出抓取的歌曲的图片,作者比较喜欢陈奕迅的歌曲:
爬取到的酷狗音乐的歌曲
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,757评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,478评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,540评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,593评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,903评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,329评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,659评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,383评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,055评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,337评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,864评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,227评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,820评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,999评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,750评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,365评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,260评论 2 258

推荐阅读更多精彩内容