你的位置:首页 > ASP.net教程

[ASP.net教程]百度流行音乐

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

  目的:

    其实最开始是在研究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     finally100     {101 102       Response.Write(sbLog.ToString());103       Response.End();104     }105   }106 }107 108 public class MoMusic109 {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

  

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

  童趣-音乐