zoukankan      html  css  js  c++  java
  • 百度流行音乐-资源数据整合

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

      目的:

        其实最开始是在研究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

      

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

      童趣-音乐

  • 相关阅读:
    C# 操作配置文件
    C# Excel操作类
    没有找到 mspdb100.dll 的解决办法
    工厂方法模式
    .Net互操作2
    The certificate used to sign “AppName” has either expired or has been revoked. An updated certificate is required to sign and install the application解决
    手机抓包xcode自带命令行工具配合wireshark实现
    expecting SSH2_MSG_KEX_ECDH_REPLY ssh_dispatch_run_fatal问题解决
    使用ssh-keygen设置ssh无密码登录
    远程复制文件到服务器
  • 原文地址:https://www.cnblogs.com/wangrudong003/p/5422486.html
Copyright © 2011-2022 走看看