程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> HtmlAgilityPack.dll爬蟲獲取百度音樂批量下載地址(C#源碼)

HtmlAgilityPack.dll爬蟲獲取百度音樂批量下載地址(C#源碼)

編輯:C#入門知識

定義一首歌曲的結構 [csharp]   public class sMp3           {              public sMp3() { }              public string strSid;//sid              public string strDownPage;//下載頁面              public string strEdition;//專輯名稱              public string strSinger;//歌手名稱              public string strUrl;//下載地址           }     在一個列表中存放所有需要解析的歌曲地址 List<sMp3> listSongs = new List<sMp3>();   [csharp]   新建一個HtmlAgilityPack.HtmlDocument對象 用來獲取和解析HTML頁面   HtmlAgilityPack.HtmlDocument hdoc_Main = new HtmlAgilityPack.HtmlDocument();     定義需要操作的XPath路徑 [csharp]  //主頁           string Baidu_Music_MainPage_strUrl   = "http://music.baidu.com/";           string Baidu_Music_MainPage_Label    = "a";           string Baidu_Music_MainPage_Value    = "sid";           string Baidu_Music_MainPage_strXpath = "./html[1]/body[1]/div[4]/div[1]/div[1]/div[2]/div[3]/div[1]/div[1]";           //下載的頁面 如 http://music.baidu.com/song/31496563/download           string Baidu_Music_DownMusic_strXpath="./html[1]/body[1]/div[1]/div[4]";                    string Baidu_Music_DownMusic_Label   = "a";           string Baidu_Music_DownMusic_Value   = "href";              string Baidu_Music_DownMusic_strXpath_Title = "./html[1]/body[1]/div[1]/div[2]";                    string Baidu_Music_DownMusic_Title   = "title";     至於這些Xpath路徑是怎麼來的..可以通過查看源代碼的方式,.也可以通過我之前發布的XPath工具(XPathTool)來查看得到。 XpathTool介紹地址  http://blog.csdn.net/witch_soya/article/details/8486893 XPathTool下載地址  http://download.csdn.net/detail/witch_soya/4978587   核心函數之一 :getLabelVal  這個函數接受一個 HtmlAgilityPack.HtmlDocument,實際上就是指定了要解析的HTML文件,strXpath是指定的Xpath語句,這樣就能通過Xpath截取HTML中一部分內容了。然後通過 strLabel和strValue 兩個參數在截取出來的內容中提取需要的指定標簽的指定屬性值。比如  HtmlAgilityPack.HtmlDocument 加載了一個html文檔,通過strXpath就獲取了該HTML文檔中的一個區域  如果指定strLabel為 “a”strValue為”href”那麼,返回的Arraylist就是該區域中a標簽的所有超鏈接地址   [csharp]   private ArrayList getLabelVal(HtmlAgilityPack.HtmlDocument dc, string strXpath, string strLabel, string strValue)           {               ArrayList Arr_Label_Val = new ArrayList();               //獲取指定的節點               HtmlNode node = dc.DocumentNode.SelectSingleNode(strXpath);               if (node == null)               {                   return null;               }               string strXPathLabel_Val = "descendant::" + strLabel;                #region                try               {                   //HtmlNodeCollection atts  = node.SelectNodes("//*[@background or @lowsrc or @src or @href]");                   //這樣得到的是基於全文的                   //HtmlNodeCollection hrefs = node.SelectNodes("//a[@href]");                   //這樣得到的是基於本節點的                                                   HtmlNodeCollection hrefs = node.SelectNodes(strXPathLabel_Val);                   if (hrefs == null)                   {                       return null;                   }                      foreach (HtmlNode href in hrefs)                   {                       if (href.Attributes[strValue] == null)                       {                           continue;                       }                       //這裡得到了歌曲的sid                       String strSid = href.Attributes[strValue].Value;                       Arr_Label_Val.Add(strSid);                                       }                  }               catch (System.Exception ex)               {                   MessageBox.Show(ex.ToString());               }               finally               {                   // f2.Show();                                  }           #endregion               return Arr_Label_Val;           }           [csharp]   //獲取百度音樂地址           private void button1_Click(object sender, EventArgs e)           {                    HtmlWeb hw = new HtmlWeb();               string url = Baidu_Music_MainPage_strUrl;               try               {                   hdoc_Main = hw.Load(url);               }               catch (System.Exception ex)               {                   MessageBox.Show(ex.ToString());                   return;               }                  //解析百度音樂主頁面 取得a標簽的sid               Arr_sid  =  getLabelVal(hdoc_Main,Baidu_Music_MainPage_strXpath, Baidu_Music_MainPage_Label, Baidu_Music_MainPage_Value);              if (Arr_sid == null)              {                  MessageBox.Show("解析主頁面標簽錯誤");                  return;              }               for (int i = 0; i < Arr_sid.Count; i++)               {                   sMp3 sMp3Song = new sMp3();                                   sMp3Song.strSid = Arr_sid[i].ToString();                                      //組裝地址                   string strDownLoadPage = "http://music.baidu.com/song/" + Arr_sid[i] + "/download";                   sMp3Song.strDownPage = strDownLoadPage;                   listSongs.Add(sMp3Song);               }                              //解析 下載音樂 網頁               Thread th = new Thread(DownLoadArrPage);               th.Start();           }           [csharp]   //解析網頁           public delegate void MyInvoke(string str1, string str2,string str3);           private void DownLoadArrPage()           {               MyInvoke mi = new MyInvoke(UpdateForm);                           HtmlWeb hw = new HtmlWeb();                              for (int i = 0; i < listSongs.Count(); i++)               {                   string strUrl =(listSongs[i].strDownPage).ToString();                   HtmlAgilityPack.HtmlDocument hdoc_DownPage = hw.Load(strUrl);                   ArrayList Arr_DownLoadUrl =  getLabelVal(hdoc_DownPage,Baidu_Music_DownMusic_strXpath, Baidu_Music_DownMusic_Label, Baidu_Music_DownMusic_Value);                   //實際上這個Arry_DownLoadUrl返回的只有一條超鏈接數據 不用遍歷了。                   listSongs[i].strUrl = Arr_DownLoadUrl[0].ToString();                   ArrayList Arr_Title = getLabelVal(hdoc_DownPage, Baidu_Music_DownMusic_strXpath_Title, Baidu_Music_DownMusic_Label, Baidu_Music_DownMusic_Title);                   listSongs[i].strEdition = Arr_Title[0].ToString();                   listSongs[i].strSinger = Arr_Title[1].ToString();               }                  //Arry_Downloadurl存放的是   /data/music/file?link=http://zhangmenshiting.baidu.com/data2/music/31626527/3149656368400128.mp3?xcode=4b1b6b4117b45f71b5949db22586f5d7 這種內容               for (int i = 0; i < listSongs.Count(); i++)               {                   string strUrl = (listSongs[i].strUrl).ToString();                      //正則表達式                   //@"demo_class.asp\?sort=([^x00-xff]{4})&id\=([a-z0-9]+)";                   Regex reg = new Regex(@"http://(.*[a-zA-Z0-9_])");                   var result = reg.Match(strUrl).Groups;                   foreach (var item in result)                   {                        //   listSongs[i].strUrl = item;                       if (item.ToString().Contains("http://") == false)                       {                           continue;                       }                       //將內容添加到列表框 第一個列表框                                           this.BeginInvoke(mi, new Object[] { listSongs[i].strEdition,listSongs[i].strSinger, item.ToString() });                       listSongs[i].strUrl = item.ToString();                      }                                  }           }    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved