百度流行音樂-資源數據整合

来源:http://www.cnblogs.com/wangrudong003/archive/2016/04/22/5422486.html
-Advertisement-
Play Games

首先在此申明,此抓取內容及發佈的地址,只用於個人研究,如涉及到版權問題,還及時聯繫作者。 目的: 其實最開始是在研究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

  

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

  童趣-音樂

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ahsupermarketshopping AH外貿公司英文企業網站源碼 http://www.51aspx.com/Code/AHForeignTradeCompanyrayxietongoa RayOA協同辦公服務平臺源碼 http://www.51aspx.com/code/RayXieTon ...
  • 昨天是周五太放鬆了,晚上沒有加班只顧著放鬆,玩了一晚上,今天又是睡了一上午,沒有學習。這下放鬆過分了沒有總結,也沒有完成任務。今天來總結一下昨天的學習成果。 昨天設計的資料庫今天老大點評了一下發現問題確實很多。比如用戶表和許可權表的拆分問題,是否應該拆分取決於許可權的使用頻率。使用頻率高時因該拆分。 對 ...
  • 近些天,看了一些博客園大牛關於webApi項目的的文章,也有請教師兄一些問題,自己做了個Demo試了試,收穫甚多。感謝感謝,下麵是我一些學習的總結,如若有錯的地方請多多指教!! WebApi登陸與身份驗證 因為在調用介面的時候都必須傳sessionKey參數過去,所以必須先登錄驗證身份。 如果是已註 ...
  • 今天幫同事看一個問題,她用為了實現動畫效果用主線程執行Thread.Sleep,然後界面就卡死了。 這個問題好解決,new 一個Thread就行了,但是更新WPF的界面需要主線程的操作,然後習慣性的打出Invoke,但是居然沒有。百度了一下發現WPF要用Dispatcher.Invoke ,故寫篇日 ...
  • 兩種方法,一種是利用error.StackTrace,另外一種是try-catch找到錯誤行數,具體如下: 一、error.StackTrace代碼 int i = ex.StackTrace.IndexOf("行號"); 二、try-catch代碼 try { //////////////// / ...
  • 相信博客園的讀者大多都是千萬“碼農”中的一員,每個人都寫過很多代碼,但並不是每一個人都能寫出高質量的代碼。rome is not built in one day !——完成高質量的代碼也不是一蹴而就的。為了寫出高質量的代碼,我們需要藉助一些手段,“代碼重構”基本上是最常用的手段,甚至是唯一的手段。 ...
  • 新框架的容器部分終於調通了!容器實在太重要了,所以有用了一個名詞叫“核心容器”。 容器為什麼那麼重要呢?這個有必要好好說道說道。 1、首先我們從框架名稱面向介面編程說起,什麼是面向介面編程?(這個度娘回答一下) 解讀一下:類是個體的定義(建模), 個體的每一方面都可以是一個介面 說白點,其一介面可以 ...
  • 第7章 成員資格、授權和安全性 7.1 安全性 ASP.NET MVC 提供了許多內置的保護機制(預設利用 HTML 輔助方法和Razor 語法進行 HTML編碼以及請求驗證等功能特性,以及通過基架構建的控制器白名單表單元素來防止重覆提交攻擊) 永遠不要相信用戶提交的任何數據。 實際的例子 每次渲染 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...