Python 爬取喜马拉雅音频

2018-01-10  本文已影响852人  Miltonlong

这段时间听歌少了,敲代码的时候喜欢把喜马拉雅FM广播打开。
既然在学习 Python ,就试着写一个爬虫,把喜马拉雅上面的音频爬下来。
分析了一下网站才发现爬喜马拉雅上的音频还是很容易的。

声明:本文只是作为技术交流,切勿作为其他用途。
声明:本文只是作为技术交流,切勿作为其他用途。
声明:本文只是作为技术交流,切勿作为其他用途。

分析网站

获取音频文件实质就是获取音频的 URL

爬取这个网站我个人比较倾向先分析最后一步,然后在往前来分析。
也就是说,我们先来看一看最后一步播放时,抓包抓取网页的返回值,得到音频信息,最重要的也就是音频的 URL。

抓包

以下面这个页面为例

http://www.ximalaya.com/91044493/album/11438377/

img1.png

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

img2.png

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

img3.png

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

img4.png

打开 headers 标签,可以看到这个 json 数据的 URL

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

这个过程简化就是 : ID -> json -> 音频 url

找到音频ID

img5.png img6.png

查看网页源代码可以看到,每一个音频的 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爬虫知识

python 关注.png
上一篇 下一篇

猜你喜欢

热点阅读