百度流行音乐-资源数据整合
首先在此申明,此抓取内容及发布的地址,只用于个人研究,如涉及到版权问题,还及时联系作者。
目的:
其实最开始是在研究vs2013环境下使用xmargin做的app,研究到webView控件的时候需要一个简单的页面来嵌套,但是个人觉得光是点测试数据没什么意思,就决定网上找下音乐方面的资源地址,可是搜索出来的好多音乐接口地址都不能使用了,所以觉得抓一下百度的音乐资源看是否能成功。
首先:
打开网页地址:http://music.baidu.com/tag/流行,立马使用gg浏览器F12,查看是否有音乐资源的地址,看到的是
第一感觉后面的数字就是资源的唯一标识符Id,然后继续点击音乐名字,F12进入到
看起来可以用的信息有:songPic(歌曲图片)和刚才第一个页面获取的信息id及songTitle(歌曲名字)(其他什么发布时间忽略),但是还是没有咋们想要的音频文件的地址和歌词,那么再继续进入播放页面
f12看到的效果是
看不到想要的音频地址,歌词地址,哪怕之前对应的id都没有了,仔细一看checkreelList_833790(0,event,this); 这个方法对应的是0,然后看每一首歌曲都有一个编号,升序往下排列这,这种情况第一反应音乐的信息应该是一个单独的文件或者ajax获取的json数据;于是乎通过network开始查找json文件或者js文件看有没有这种明显的音乐数据库信息;查找结果如下:
格式化之后的数据songinfo文件:
对应的还是Id,歌曲名称,图片地址,没有想要的信息;那么继续往下面找信息songlink文件中
已经看到了mp3的资源信息,复制到浏览器打开,没错可以下载,然后打开能正常播放出歌曲声音,并且以.lrc结尾的地址就是歌词了,可以看一下;走到这里感觉好像挺简单的获取到了想要的信息,但是有没有注意到最开始的时候是点击了一首歌曲,现在出现的好像是一个列表的信息,仔细观察第一首歌曲的确是刚才选择的,下面的一些歌曲是默认按照第一个页面流行先后顺序来的,那么回到第一个页面点击两首歌曲,然后点击播放选中歌曲,直接又跳转到了刚才的播放页面,但是细心的朋友会发现浏览器地址栏里面是这样的如:
然后和最开始选中一首歌曲的地址栏对比:
是不是多了几个数字,发现多的这几个数字正好就是前面说的音乐的唯一编号Id,再看刚才说的songinfo和songlink文件都有刚才选择的歌曲的信息,然后做一下数据的整合就有了下面的代码:

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Text.RegularExpressions; 6 using System.Web; 7 using System.Web.UI; 8 using System.Web.UI.WebControls; 9 using TaskPlugin; 10 11 public partial class SourceTool : System.Web.UI.Page 12 { 13 protected void Page_Load(object sender, EventArgs e) 14 { 15 16 } 17 18 protected void btnFidder_Click(object sender, EventArgs e) 19 { 20 21 var sbLog = new StringBuilder(string.Empty); 22 try 23 { 24 var musices = new List<MoMusic>(); 25 26 //1.获取-流行音乐歌单 27 var p_url = "http://music.baidu.com/tag/流行"; 28 var p_music = PublicClass._HttpGet(p_url); 29 if (string.IsNullOrEmpty(p_music)) { sbLog.Append("获取音乐列表失败\n"); return; } 30 31 var pm = Regex.Matches(p_music, "title=\"(?<title>[^\"]+)[^>]+>(?<m_name>[^<]+)[^h]+href=\"/mv/(?<sid>[^\"]+)[^\\?]+[^>]+>(?<a_name>[^<]+)"); 32 if (pm.Count <= 0) { sbLog.Append("获取音乐列表失败\n"); return; } 33 34 var sids = string.Empty; 35 foreach (Match item in pm) 36 { 37 38 var music = new MoMusic(); 39 music.M_Sid = item.Groups["sid"].Value; 40 music.M_Name = item.Groups["m_name"].Value; 41 music.M_Gif = "http://musicdata.baidu.com/data2/pic/9e815fa08f315c5577acb8efff6cc63f/262002544/262002544.jpg"; //默认图片 42 music.A_Name = item.Groups["a_name"].Value; 43 44 sids += music.M_Sid + ","; 45 musices.Add(music); 46 } 47 48 //2.获取对应音乐的图片 49 sids = sids.TrimEnd(','); 50 var pp_url = "http://play.baidu.com/data/music/songinfo"; //获取图片地址 51 var pp_music = PublicClass._HttpPost(pp_url, string.Format("songIds={0}", sids)); 52 if (!string.IsNullOrEmpty(pp_music)) 53 { 54 55 var ppm = Regex.Matches(pp_music, "\"songId\":\"(?<m_sid>[^\"]+)[^P]+[^:]+:\"(?<m_gif>[^\"]+)"); 56 if (ppm.Count <= 0) { return; } 57 58 foreach (Match item in ppm) 59 { 60 var sid = item.Groups["m_sid"].Value.Trim(); 61 var m_gif = item.Groups["m_gif"].Value.Trim(); 62 if (string.IsNullOrEmpty(sid) || string.IsNullOrEmpty(m_gif)) { continue; } 63 64 var moMusic = musices.Where(b => b.M_Sid == sid).SingleOrDefault(); 65 moMusic.M_Gif = m_gif.Replace("\\", ""); ; 66 } 67 } 68 69 //3.音乐资源信息地址 70 var ppp_url = "http://play.baidu.com/data/music/songlink"; //获取播放文件地址 71 var ppp_music = PublicClass._HttpPost(ppp_url, string.Format("songIds={0}&hq=0&type=m4a%2Cmp3&rate=&pt=0&flag=-1&s2p=-1&prerate=-1&bwt=-1&dur=-1&bat=-1&bp=-1&pos=-1&auto=-1", sids)); 72 if (string.IsNullOrEmpty(ppp_music)) { sbLog.Append("获取播放文件地址失败\n"); return; } 73 74 var pppm = Regex.Matches(ppp_music, "\"songId\":(?<m_sid>[^,]+)[^\\/]+(?<m_lrc>http:[^\"]+)[^\\/]+(?<m_link>http:[^\"]+)"); 75 if (pppm.Count <= 0) { sbLog.Append("获取播放文件地址失败\n"); return; } 76 77 foreach (Match item in pppm) 78 { 79 var sid = item.Groups["m_sid"].Value.Trim(); 80 var m_link = item.Groups["m_link"].Value.Trim(); 81 var m_lrc = item.Groups["m_lrc"].Value.Trim(); 82 if (string.IsNullOrEmpty(sid) || string.IsNullOrEmpty(m_link)) { continue; } 83 84 var moMusic = musices.Where(b => b.M_Sid == sid).SingleOrDefault(); 85 moMusic.M_Link = m_link.Replace("\\", ""); 86 moMusic.M_Lrc = m_lrc.Replace("\\", ""); 87 } 88 89 var result = Newtonsoft.Json.JsonConvert.SerializeObject(musices); 90 //生成json文件 91 PublicClass._WriteLog(result, "Music", false, false, ".json"); 92 93 sbLog.Append(result); 94 } 95 catch (Exception ex) 96 { 97 sbLog.AppendFormat("异常信息:{0}\n", ex.Message); 98 } 99 finally 100 { 101 102 Response.Write(sbLog.ToString()); 103 Response.End(); 104 } 105 } 106 } 107 108 public class MoMusic 109 { 110 111 /// <summary> 112 /// 音乐编号 113 /// </summary> 114 public string M_Sid { get; set; } 115 116 /// <summary> 117 /// 音乐名称 118 /// </summary> 119 public string M_Name { get; set; } 120 121 /// <summary> 122 /// 音乐图片 默认: 123 /// </summary> 124 public string M_Gif { get; set; } 125 126 /// <summary> 127 /// 音乐地址 128 /// </summary> 129 public string M_Link { get; set; } 130 131 /// <summary> 132 /// 音乐歌词文件地址 133 /// </summary> 134 public string M_Lrc { get; set; } 135 136 /// <summary> 137 /// 音乐MV地址 138 /// </summary> 139 public string M_MV { get; set; } 140 141 /// <summary> 142 /// 作者音乐集地址 143 /// </summary> 144 public string A_Url { get; set; } 145 146 /// <summary> 147 /// 作者名字 148 /// </summary> 149 public string A_Name { get; set; } 150 151 }
音乐编号,音乐名称,音乐图片,音乐地址,音乐歌词文件地址,作者名字 这些属性值都有了;再顺便弄一个数据的展示页面,音乐可以点击的:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?