• 百度流行音乐-资源数据整合


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

      目的:

        其实最开始是在研究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("获取音乐列表失败
    "); 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("获取音乐列表失败
    "); 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("获取播放文件地址失败
    "); 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("获取播放文件地址失败
    "); 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}
    ", 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

      

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

      童趣-音乐

  • 相关阅读:
    php面试专题---2、常量及数据类型考点
    php面试专题---3、运算符考察点
    php面试专题---1、php中变量存储及引用的原理
    html中map标签和area标签的应用(总结)
    nginx中如何设置gzip(总结)
    PHP缓存技术OB系统函数(总结)
    Http协议面试题(总结)
    剑指offer 例题
    程序的模块化的一些见解6-读牛人代码之感
    oracle dblink造成远程数据库session过多
  • 原文地址:https://www.cnblogs.com/wangrudong003/p/5422486.html
Copyright © 2020-2023  润新知