百度流行音樂-資源資料整合

神牛003發表於2016-04-22

  首先在此申明,此抓取內容及釋出的地址,只用於個人研究,如涉及到版權問題,還及時聯絡作者。

  目的:

    其實最開始是在研究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

  

  音樂編號,音樂名稱,音樂圖片,音樂地址,音樂歌詞檔案地址,作者名字 這些屬性值都有了;再順便弄一個資料的展示頁面,音樂可以點選的:

  童趣-音樂

 

相關文章