首先在此申明,此抓取內容及釋出的地址,只用於個人研究,如涉及到版權問題,還及時聯絡作者。
目的:
其實最開始是在研究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 }
音樂編號,音樂名稱,音樂圖片,音樂地址,音樂歌詞檔案地址,作者名字 這些屬性值都有了;再順便弄一個資料的展示頁面,音樂可以點選的: