文章出處

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

  目的:

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

  

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

  童趣-音樂

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()