You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:59:55