最近家里那位又让我下载英语的听力音频了,不过这次没让我扫二维码(微信小程序方式下载可参考之前的文章:下载微信小程序音频),而是发了一大堆链接过来,打开链接看是一个网页播放器,通过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一直递归,直到最后一个音频文件。