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

     2014年8月19日15:26:16 说明:  有些网友发私信或在资源下留言问现在为什么无法抓取百度音乐排行榜了,是不是源代码有问题或代码不全面。

     首先感谢你的关注,其次想说这个小工具仅仅是通过抓取百度音乐页面来展示一下C#抓取网页的效果,代码简单的不能再简单了。百度音乐页面结构一直在调整,现在工具无法分析百度音乐排行榜是正常的,有兴趣的同学自己改一下XPATH语句就可以了。



最近对爬虫比较感兴趣。刚上手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就能得到歌手名和歌曲名了


在工具中查看  ./html[1]/body[1]/div[1]/div[4]    中a标签的href值



得到a标签中的href属性了,再进行第4步操作。就是只截取link后面的地址。这个截取的操作可以用字符串的截断。为了保险起见,以后可能会有更复杂的字符操作,于是用了C#的正则表达式。菜鸟一个,百度N久,写出一个表达式匹配出来的网址有重复,于是再次动用字符比对,去掉重复。最终的效果如图。




一键复制到迅雷中新建任务



就是有一点不是很爽。就是下载的文件都是默认的文件名。根本分不清楚那首歌是哪个唱的。


最后还有一点就是最终得到的地址如下面的,似乎只在某一个时间段内有效。过了之后就没效果了。所以这个链接必须是实时生成的。

http://zhangmenshiting.baidu.com/data2/music/31626527/314965631355824861128.mp3?xcode=579310cfec023f9306edad312dee4049
http://zhangmenshiting.baidu.com/data2/music/31626521/31583990136800128.mp3?xcode=579310cfec023f93ea3e51c28627c0b9
http://zhangmenshiting.baidu.com/data2/music/31400033/3138763390000128.mp3?xcode=579310cfec023f93ea3e51c28627c0b9
http://zhangmenshiting.baidu.com/data2/music/31688889/31683273118800128.mp3?xcode=579310cfec023f93ea3e51c28627c0b9
http://zhangmenshiting.baidu.com/data2/music/31404291/313051881355828461128.mp3?xcode=579310cfec023f93ea3e51c28627c0b9
http://zhangmenshiting.baidu.com/data2/music/31404304/31305198108000128.mp3?xcode=579310cfec023f93d11955fe7ca3bb0f
http://zhangmenshiting.baidu.com/data2/music/31573022/31495820244800128.mp3?xcode=579310cfec023f93d11955fe7ca3bb0f
http://zhangmenshiting.baidu.com/data2/music/31407347/313988551355810461128.mp3?xcode=579310cfec023f93d11955fe7ca3bb0f
http://zhangmenshiting.baidu.com/data2/music/31626209/315861311355824861128.mp3?xcode=579310cfec023f93d11955fe7ca3bb0f
http://zhangmenshiting.baidu.com/data2/music/31631093/3162868782800128.mp3?xcode=579310cfec023f93d11955fe7ca3bb0f



先写到这里。明天就接着贴代码

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值