日期:2014-05-17 浏览次数:20708 次
最近对爬虫比较感兴趣。刚上手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就能得到歌手名和歌曲名了
在工具中查看