最近家里那位又让我下载英语的听力音频了,不过这次没让我扫二维码(微信小程序方式下载可参考之前的文章:下载微信小程序音频),而是发了一大堆链接过来,打开链接看是一个网页播放器,通过F12调试工具能发现音频的url,复制音频url可以直接下载。
不过一大堆链接呢,一个一个下载也挺麻烦,仔细看调试工具,发现有个GetFile的api请求,能获取到一本教材所有的音频文件信息,包括下载路径和文件名称。这就好操作了,请求该api,获取到音频文件名和对应的下载路径,然后请求下载路径保存就行了,于是花了点时间用python写了个批量下载,代码如下:
注:emmm,代码写好了,也运行下载好了,不过之后想了想,这次下载的53教材好像用的还挺广泛的,于是才想起百度一下,还真有资源而且都整理好了-_-!想要下载音频的朋友不用看代码,可以直接在53小学英语听力下载这里找对应的教材来下载。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: Yujichang
# description: 下载53天天练英语听力音频文件
import requests
import os
from collections import deque
from threading import Thread
# 是否完成所有文件读取
READ_FILE_FINISH = False
# 53天天练音频文件信息api
url = 'https://api.zhibuji.com/zhi53/api/Resource/GetFile'
headers = {
'content-type': "application/x-www-form-urlencoded",
'cache-control': "no-cache"
}
audio_files = deque()
def get_audio_file(file_id):
"""
递归获取音频的信息,并添加到队列
"""
global READ_FILE_FINISH
if file_id is None:
READ_FILE_FINISH = True
return
payload = 'Id=' + file_id
response = requests.request("POST", url, data=payload, headers=headers)
response.encoding = 'utf-8'
audio_files.append((response.json()['Data']['FileName'],
response.json()['Data']['FileSuffix'],
response.json()['Data']['FilePath'])
)
next_file_id = response.json()['Data']['AudioInfo']['NextFileId']
get_audio_file(next_file_id)
def download_audio_file(path=None):
"""
从队列获取音频信息,下载音频
"""
if path is None:
path = os.getcwd()
while True:
if audio_files:
name, file_suffix, file_url = audio_files.popleft()
file_path = os.path.join(path, name + file_suffix)
response = requests.get(file_url)
print('INFO: {}开始下载...'.format(name + file_suffix))
with open(file_path, "wb") as f:
f.write(response.content)
print('INFO: {}下载完成!'.format(name + file_suffix))
elif not READ_FILE_FINISH:
continue
else:
break
if __name__ == '__main__':
# 第一个开始下载的音频文件id,在url上有这个参数
file_id = "6350479a-377c-11ea-bbca-ec0d9a30b0c2"
path = r'C:\'
t1 = Thread(target=get_audio_file, args=(file_id,))
t2 = Thread(target=download_audio_file, args=(path,))
t1.start()
t2.start()
t1.join()
t2.join()
代码根据实际情况修改file_id 和 path参数就可以运行,file_id是第一个需要下载的音频文件id,然后代码会根据GetFile api获取的下一个音频文件id一直递归,直到最后一个音频文件。