百度流行音乐-资源数据整合

简介:   首先在此申明,此抓取内容及发布的地址,只用于个人研究,如涉及到版权问题,还及时联系作者。   目的:     其实最开始是在研究vs2013环境下使用xmargin做的app,研究到webView控件的时候需要一个简单的页面来嵌套,但是个人觉得光是点测试数据没什么意思,就决定网上找下音乐方面的资源地址,可是搜索出来的好多音乐接口地址都不能使用了,所以觉得抓一下百度的音乐资源看是否能成功。

  首先在此申明,此抓取内容及发布的地址,只用于个人研究,如涉及到版权问题,还及时联系作者。

  目的:

    其实最开始是在研究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 }
View Code

  

  音乐编号,音乐名称,音乐图片,音乐地址,音乐歌词文件地址,作者名字 这些属性值都有了;再顺便弄一个数据的展示页面,音乐可以点击的:

  童趣-音乐

 

目录
相关文章
|
3月前
|
关系型数据库 MySQL 数据库
百度搜索:蓝易云【【Docker】Docker部署Mysql并设置数据持久化教程】
通过以上步骤,您已经成功地在Docker中部署了MySQL,并设置了数据持久化,确保数据在容器重新启动或迁移时得以保留。
50 0
|
4月前
|
Java 数据安全/隐私保护 Spring
Spring案例:百度网盘密码数据兼容处理
Spring案例:百度网盘密码数据兼容处理
42 0
|
自然语言处理 BI 数据处理
【数据对比】综合分析百度情感分析以及华为情感分析的差异,我有了如下结果
【数据对比】综合分析百度情感分析以及华为情感分析的差异,我有了如下结果
280 0
|
4月前
|
定位技术
利用MultCloud在线复制传输不同网盘之间的数据:支持谷歌Drive、百度网盘等
利用MultCloud在线复制传输不同网盘之间的数据:支持谷歌Drive、百度网盘等
123 1
|
4月前
|
消息中间件 Shell Docker
百度搜索:蓝易云【docker rabbitmq-清空queue队列数据】
通过以上步骤,您可以使用Docker清空RabbitMQ队列的数据。这将帮助您重置队列并清除旧数据,以进行新的测试或使用。
33 0
|
6月前
|
JSON 数据格式 Python
百度搜索:蓝易云【Python数据使用HTTP代理教程!】
总结: 以上是使用Python进行数据请求时使用HTTP代理的简要教程。通过设置代理字典并将其传递给requests库的请求方法,你可以在Python中使用HTTP代理来发送和接收数据。请注意,代理的具体设置可能会因实际的代理类型和配置而有所不同。确保使用适当的代理地址和端口号,并根据代理提供商的要求进行设置。
28 1
|
9月前
|
定位技术
百度拾取经纬度坐标转化的geojson数据偏离中心的解决方案
百度拾取经纬度坐标转化的geojson数据偏离中心的解决方案
99 0
基于百度统计的城市人口迁徙数据做数据
基于百度统计的城市人口迁徙数据做数据
165 0
基于百度统计的城市人口迁徙数据做数据
|
文字识别 开发工具 Python
Python编程:通过百度文字识别提取表格数据
Python编程:通过百度文字识别提取表格数据
138 0
Python编程:通过百度文字识别提取表格数据
|
JSON JavaScript 前端开发
Python进阶篇:百度指数解密【抓包|JS逆向|数据区分】
Python进阶篇:百度指数解密【抓包|JS逆向|数据区分】
325 0