日期:2014-05-17  浏览次数:20708 次

HtmlAgilityPack 爬虫批量获取百度音乐下载地址一

最近对爬虫比较感兴趣。刚上手C#。于是想试试用C#实现一个爬虫,获取百度音乐的下载地址。本文没什么技术含量。只是个人兴趣,所以不厌其烦写下过程,让有兴趣的做一个参考。

 

     如图 百度音乐的首页

   



我以抓取新歌Top100这个榜单上的10首歌的下载地址为例说一下整个过程。

它对应的源代码是



这里我们看到在歌曲的名字上有一个超链接。”/song/31496563”  实际上是指向这首歌的歌词和基本信息的页面。注意<a> 标签中有一个sid值也是31496563


      进入下载页面后, 打开的是http://music.baidu.com/song/31496563/download


     这里假设所有歌曲的下载页面地址是  http://music.baidu.com/song/歌曲的sid/download

    依次查看了其他几首歌的下载页面,基本可以确定是这样了。

    接着我们看源代码



        下载按钮对应了一个超链接。点击这个链接,浏览器就直接跳出了下载的文件。

       实际上歌曲的地址就是那个 link= 后面的地址

        http://zhangmenshiting.baidu.com/data2/music/31626527/314965631355824861128.mp3?xcode=16ac04c627eeedb317e77954bed13215

       这个是可以通过迅雷-新建任务 来下载的。


那么我们的流程是

1    解析百度音乐主页获取到具体一首歌的 sid 值

2    根据sid值就能找到对应的歌曲下载页面

3    解析歌曲下载页面 找到下载按钮对应的超链接

4    取超链接的link后面的地址作为最终有效的下载地址

5    保存有效下载地址 并输出为txt文本

6    将txt文本内容通过迅雷新建任务实现下载

7    收工。


     

         整个流程的思路搞清楚了。可以开始准备动手编码了。

       编码之前。要考虑一个问题。网页内容的加载,用什么,解析用什么。之前在写QQ空间日志下载的时候,是用C++实现的。下载网页,内容解析完全是基于字符串的操作。如果现在还用字符串查找,再搜索,截断这种原始的操作一定会崩溃的。

 

        在网上找到一个口碑极好的C# dll,HtmlAgilityPack.dll,用它来下载网页并转换为节点进行操作,个中强大非三言两语能说完。

 

          HtmlAgilityPack.DLL是基于XPath操作的。XPath的简介和语法见http://www.w3school.com.cn/xpath/  


        现在基于XPath的基础上,再看一遍主页的源代码

     

这次我们着重看这个节点的分布。

用XPath来描述新歌Top100里面的内容,就是

./html[1]/body[1]/div[4]/div[1]/div[1]/div[2]/div[3]/div[1]/div[1] 

        如果不知道它代表什么意思,看起来就有些诡异。实际上它的意思就是 html标签下面的第一个body标签下面的第四个div如此类推。

       为了分析html和xpath之间的关系。我又单独写了一个XPath分析工具可以查看到这样的效果

         


这个意思就是提取出

. ./html[1]/body[1]/div[4]/div[1]/div[1]/div[2]/div[3]/div[1]/div[1] 节点下面 <a>标签中的所有 sid 


假设sid就是 31496563  那么下载页面就是

http://music.baidu.com/song/31496563/download  要找这个页面中的下载按钮对应的超链接,可以用Xpath表达式  再提取出其中的a标签的href属性值 就能得到包含歌曲下载地址的字符串了


在工具中查看

./html[1]/body[1]/div[1]/div[2] 中a标签的title就能得到歌手名和歌曲名了


在工具中查看