起因:老爸让我下载几千首歌曲给他在车上播放,感觉手动下载,就算批量下载也要时间,索性写个爬虫自动下载吧。。
对于这个爬虫小项目,选择了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是获取页面上的信息,传入用于dom操作staticgetCurPalyList(用于dom操作 static getCurPalyList(用于dom操作staticgetCurPalyList(){
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,直接下载该歌手的热门歌曲。

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

node爬取网易云歌曲相关推荐

  1. 爬取网易云歌曲榜单中网易云歌曲及其对应id xpath csv re requests python

    基操爬取网易云歌曲榜单中网易云歌曲及其对应id 回顾xpath csv re requests 先进行基础抓包! 1 2 3 然后就是代码啦,兄弟们,我的代码都很完整,看懂思路,直接收藏复制粘贴就可以 ...

  2. Python爬取网易云歌曲评论,做词云分析

    前言 emmmm 没什么说的,想说的都在代码里 环境使用 Python 3.8 解释器 3.10 Pycharm 2021.2 专业版 selenium 3.141.0 本次要用到selenium模块 ...

  3. Python利用selenium简单的爬取网易云歌曲排行榜

    最近学习了一下selenuim和XPath,技术还很菜,简单的爬取了一下网易云歌曲的排行榜信息,最后保存到mongodb里面 要爬取的部分如下图所示: 爬取每个歌曲的排名,名称,时长,歌手. 创建mo ...

  4. 如何用Python爬取网易云歌曲?秘诀在这~

    说到近年来程序界最火的事情是什么呢?您一定会想到Python的兴起.根据研究,Python已经成为排名前三的语言.也许你会困惑,Python能这么火的原因是什么呢? 首先是Python工具上手很快,它 ...

  5. python3 爬取网易云歌曲详情

    上一篇介绍了爬网易云歌手id, 在这里我们可以用获取的id数据来构造歌手详情页的url.在这里呢我还是比较习惯使用selenium来爬. 简单介绍一下selenium: 它是浏览器的一个自动化测试框架 ...

  6. python爬取网易云歌曲名字

    之前都是按部就班的往下写, 终于尝试在爬虫里写函数了 网址:https://music.163.com/#/artist?id=9272,爬取这50首歌的名字.分析网址:网易云主页是https://m ...

  7. python3爬取网易云歌曲的相关信息

    打开网易云音乐的[云音乐飙升榜]:https://music.163.com/#/discover/toplist ,按F12检查元素,切换到Network,然后选择Doc,可以查看接口得到的数据,如 ...

  8. python爬取网易云歌曲高清封面

    以哪里都是你这首歌举例子吧 https://music.163.com/#/song?id=488249475 首先定位一下歌曲专辑的位置 用xpath定位可写成 //meta[16]/@conten ...

  9. 爬虫python代码网易云_使用python爬取网易云歌曲下载时为0KB的解决方法 | ZPY博客...

    歌曲的下载地址为http://music.163.com/song/media/outer/url?id=xxx 用urllib.request.urlretrieve方法下载总是为0KB.但是奇怪的 ...

最新文章

  1. MockDialog
  2. IIS环境下如何批量添加、修改、删除绑定的域名
  3. Kong APIGW — Plugins — Security
  4. ZH奶酪:Java调用NLPIR汉语分词系统
  5. Docker-compose 安装Jenkins
  6. Master PDF editor在ubuntu下面的配置
  7. centos虚拟机根目录空间分配
  8. 【要闻】Kubernetes安全问题严峻、Linux v5.4安全性浅谈
  9. Read the Docs 文档管理
  10. mysql多数据库并发控制_什么是数据库并发控制?数据库并发控制的主要方法是?...
  11. 【Docker容器】进入容器的2种方式
  12. IDEA 方法自动添加注释
  13. 儿童“益”站线上课堂 战“疫”不停学
  14. html在excel中查询,excel通配符查找 excel任意字母的通配符
  15. 流体力学——漩涡运动
  16. 2月全球搜索引擎市场份额之争:百度战胜Google夺冠
  17. 《30天自制操作系统》学习笔记--第12天
  18. 21世纪最实用的智能营销软件是哪个
  19. 信号是受噪声Nt干扰的余弦波Xt = Acoswt + φ + Nt,试求它的自相关函数。假设φ是在[0, 2Π]上均匀分布的随机变量,Nt是均值为0方差为σ2的白噪声,且 Nt 与 φ 互不相关。
  20. 32位和64位系统支持的最大内存

热门文章

  1. CSS——引入阿里字体图标步骤
  2. SCIPY类库——最小二乘法应用
  3. 2015-10-13 OC语言中的复合
  4. TCP连接的建立和释放过程详解(三次握手、四次挥手)
  5. idea工具整合前端vue,nodeJs步骤
  6. 计算机excel 的分栏在哪,excel分栏在哪里
  7. 如何最简单、通俗地理解Python的pandas库?
  8. 域名会到期吗?到期的域名会怎么处理呢?
  9. 强制IE使用兼容模式
  10. SpringBoot + Spring Cloud +Vue 管理系统前端搭建(六、完善登录流程)