动机
最近想下载一下自己在蜻蜓FM上上传的音频,发现不支持批量下载。于是去找了一些下载器,万万没想到,该下载器只能下载前十条,再下要注册,注册费5元。尼玛,不能忍。本来就不是太难的技术,还搞这种收费, 真无语了。
声明
对于使用通用资源格式(如mp3)传输的音频资源,使用python爬虫获取要比去寻找破解的下载器要方便的多。而且平台不对音频做编码和隐藏也相当于默认了支持用户下载。
但是还是要强调一下,我们要尊重法律和平台的版权。
- 不要破解付费资源
- 不要将音频用于商业盈利
下载
由于荔枝FM网页版做的很差,也不提供搜索框,所以想要搜到自己的作品就需要花费一段功夫了。
首先进入荔枝的个人主页,拿到自己的FMid,如图中的右上角。
将荔枝的官网url和id拼在一起就能进入网页版的个人作品了:https://www.lizhi.fm/29…72
这里就是我们的音频所在地了,此时复制地址栏的url一般形如https://www.lizhi.fm/user/53…6,这就是我们下载的起始url了。
下载的逻辑很简单:首先将当前页的音频链接提取出来,分别下载;然后找到标签<next>即下一页的链接,拉取新的页面下载,直到全部下载结束。代码如下:修改url为你自己的链接即可下载。
import urllib.request
import requests
from urllib.error import URLError, HTTPError, ContentTooShortError
from bs4 import BeautifulSoup
import time
def GetData(url, proxy='', retry =2):
print('download : ' + url)
if proxy == '':
proxy= 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11'
request = urllib.request.Request(url)
request.add_header('User-Agent',proxy)
try:
html = urllib.request.urlopen(request).read()
return html
except (URLError, HTTPError, ContentTooShortError) as e:
print('download error :', e.reason)
if retry>0: #递归重试下载
if hasattr(e, 'code') and 500<e.code<600 :
GetData(url, proxy, retry-1)
# 替换为你自己的url
url = 'https://www.lizhi.fm/user/53................6'
while url is not None:
html = GetData(url)
soup = BeautifulSoup(html, 'html.parser')
# 获取所有音频的链接
trs = soup.find_all(attrs={'class':'clearfix js-play-data audio-list-item'})
for tr in trs:
link = 'https://www.lizhi.fm/' + tr['href']
music_name = './download' + '//' + tr['data-title'] + '.mp3'
print("the link is : "link, "downloads file to "music_name)
music_file = requests.get(link).content
with open(music_name, "wb") as f:
f.write(music_file)
time.sleep(2)
# 获取下一页的链接
if soup.find(attrs={'class':'next'}):
url = 'https://www.lizhi.fm' + soup.find(attrs={'class':'next'})['href']
else:
break;
print("The next page:", url)
time.sleep(6)
最后声明一下,尊重他人创作,不要随意传播。