这段时间听歌少了,敲代码的时候喜欢把喜马拉雅FM广播打开。
既然在学习 Python ,就试着写一个爬虫,把喜马拉雅上面的音频爬下来。
分析了一下网站才发现爬喜马拉雅上的音频还是很容易的。
声明:本文只是作为技术交流,切勿作为其他用途。
声明:本文只是作为技术交流,切勿作为其他用途。
声明:本文只是作为技术交流,切勿作为其他用途。
分析网站
获取音频文件实质就是获取音频的 URL
爬取这个网站我个人比较倾向先分析最后一步,然后在往前来分析。
也就是说,我们先来看一看最后一步播放时,抓包抓取网页的返回值,得到音频信息,最重要的也就是音频的 URL。
抓包
以下面这个页面为例
http://www.ximalaya.com/91044493/album/11438377/

随意打开一个音频的播放界面,按下 F12 打开开发人员工具,如果有内容了,就清空。然后点击网页上的播放按钮。

可以看到网页返回了一个 json 数据。

图片中红色方框区域就是 音频的 URL ,我们找到了 URL ,这个程序就完成了一大半了。

打开 headers 标签,可以看到这个 json 数据的 URL
注意这个 URL 后面的这一串数字,这一串数字实际上就是这个音频的 ID,相当于人的身份证号,是唯一的。实际上,我们只要拿到了每一个音频的 ID,就可以通过这个 ID 来获取这个 json 数据,从而获取到音频的 URL。我测试过,三个地址都是音频URL。我们只要一个就好。
这个过程简化就是 : ID -> json -> 音频 url
找到音频ID


查看网页源代码可以看到,每一个音频的 ID 实际上都已经写在了网页源代码中。
那么这个事情就变得很明了了。
写代码
还是从后往前做,我们先来写通过 json 数据来获取音频 URL 并下载音频的函数。
def download(url):
req = requests.get(url,headers = hd) # hd 为 user-agent
result = req.text
result = json.loads(result)
title = result['title']
data_url = result['play_path_64']
data = requests.get(data_url).content
with open('%s.m4a'%title,'wb') as f:
f.write(data)
这里传的 url 参数是 json 数据的 url 。
现在就需要来构造 json 的 url ,那么还需要做一些前期工作,就是先获取音频 ID。就以此页面为例,就用正则就可以获取到。
# http://www.ximalaya.com/tracks/66104267.json json 的 url 格式,不同的只是 ID
def get_id(url):
req = requests.get(url, headers=hd)
result = req.text
id_number = re.findall('sound_id="([\d]*?)"',result)
id_number = set(id_number) # 由于页面上有重复的 ID,故利用集合的属性去掉其重复的 ID
id = []
for number in id_number:
id.append('http://www.ximalaya.com/tracks/' + number + '.json') # 这样构造url是不太严谨的,当然在这里是可以的,以后再探讨 url 的构造方法
return id
获取了页面所有音频的 ID ,构造了 json 的 url ,也写好了下载音频的函数,那么最后就差写个循环将所有的音频下载下来了。
for url in get_id('http://www.ximalaya.com/91044493/album/11438377/'):
download(url)
总结
这个程序写的很简陋,用了三个模块 requests,re,json,代码也不过30行左右,只能下载一个页面的所有音频。当然,如果愿意话,可以写的功能更加强大,那个就请读者来根据需要私人定制了。因为在这个爬虫里面,最关键的部位已经得到解决了。爬取喜马拉雅这个网站还是比较简单的,主要就是抓包那一步,弄清楚数据的来源,很多问题就很简单了。
更多内容请关注公众号:python爬虫知识

网友评论