求助:如何用Node.js结合Cheerio实现Billboard说唱歌手歌曲爬取
嘿,我来帮你搞定这个Node.js脚本的实现,一步步拆解下来其实很清晰,下面是完整的方案和代码:
实现思路与完整代码
我们需要完成四个核心环节:处理命令行参数、构造正确的Billboard歌手页面URL、请求并解析页面、提取歌曲名并打印。
1. 处理命令行参数
用户传入的歌手名可能带空格(比如Cardi B),所以得把process.argv里从第3项开始的参数拼接成完整名称,同时还要做参数校验,防止用户没传歌手名:
const singerName = args.slice(2).join(' '); if (!singerName) { console.log('请传入歌手名称哦,比如:node Singer.js Drake'); process.exit(1); }
2. 构造歌手页面URL
Billboard的说唱歌手页面格式是https://www.billboard.com/music/rap/[小写连字符形式的歌手名],比如Drake的页面就是https://www.billboard.com/music/rap/drake。所以我们要把歌手名转成小写,空格替换成连字符:
const formattedSingerName = singerName.toLowerCase().replace(/\s+/g, '-'); const url = `https://www.billboard.com/music/rap/${formattedSingerName}`;
3. 请求页面并提取歌曲名
用request发起请求,拿到页面HTML后用cheerio解析。我查了下Billboard歌手页面的结构,热门歌曲的标题都在h3.music-chart-row__title这个标签里,直接用这个选择器就能提取:
request(url, (error, response, body) => { if (error) { console.error('网络请求出问题啦:', error); return; } if (response.statusCode !== 200) { console.log(`请求失败,状态码${response.statusCode},可能是歌手名称不对哦`); return; } const $ = cheerio.load(body); const songs = []; $('h3.music-chart-row__title').each((index, element) => { const songTitle = $(element).text().trim(); if (songTitle) { songs.push(songTitle); } }); if (songs.length === 0) { console.log(`没找到歌手${singerName}的歌曲信息呢`); return; } // 打印歌曲列表 console.log(`\n${singerName}的热门歌曲:`); songs.forEach((song, index) => { console.log(`${index + 1}. ${song}`); }); });
完整可运行代码
把上面的部分整合起来,你的Singer.js完整代码如下:
var request = require('request'); var cheerio = require('cheerio'); const args = process.argv; // 处理命令行参数 const singerName = args.slice(2).join(' '); if (!singerName) { console.log('请传入歌手名称哦,比如:node Singer.js Drake'); process.exit(1); } // 构造歌手页面URL const formattedSingerName = singerName.toLowerCase().replace(/\s+/g, '-'); const url = `https://www.billboard.com/music/rap/${formattedSingerName}`; // 请求并解析页面 request(url, (error, response, body) => { if (error) { console.error('网络请求出问题啦:', error); return; } if (response.statusCode !== 200) { console.log(`请求失败,状态码${response.statusCode},请检查歌手名称是否正确`); return; } const $ = cheerio.load(body); const songElements = $('h3.music-chart-row__title'); if (songElements.length === 0) { console.log(`没找到歌手「${singerName}」的相关歌曲信息呢`); return; } console.log(`\n${singerName}的热门歌曲:`); songElements.each((idx, el) => { const title = $(el).text().trim(); console.log(`${idx + 1}. ${title}`); }); });
一些小提示
- 👉
request模块已经被官方标记为废弃了,如果是新项目,建议换成axios或者node-fetch,用法差不多,只是请求代码稍微调整下就行。 - 👉 如果以后提取不到歌曲了,大概率是Billboard改了页面结构,你可以打开歌手页面,用浏览器的开发者工具(F12)重新找歌曲标题的CSS选择器。
- 👉 要是歌手名有特殊字符,可能需要额外处理,但大部分情况用上面的小写+连字符转换就够了。
内容的提问来源于stack exchange,提问作者ayay
相关产品推荐
相关产品推荐

