欢迎光临UUpython
最大、最新、最全的Python代码收集站

青少年读本打包下载

这段代码是一个用于批量下载青少年读本文件的脚本,它使用了多线程的方式进行文件下载。以下是代码的主要功能和流程:

  1. 导入所需模块:导入了requests、os和ThreadPoolExecutor模块。
  2. 定义青少年读本文件列表URL:url变量存储了获取青少年读本文件列表的URL。
  3. 定义下载目录:download_dir变量存储了下载文件的目录路径。
  4. 定义下载集合:download_lists变量用于存储下载任务,每个任务由文件的下载链接和保存路径组成。
  5. 定义download_list函数:该函数发送HTTP请求获取青少年读本文件列表的JSON数据,然后遍历每个文件项,提取文件的下载链接和保存路径,并将任务添加到download_lists集合中。
  6. 定义download函数:该函数接收文件的下载链接和保存路径作为参数,通过requests.get方法下载文件内容,然后保存到指定的输出路径。
  7. 主程序入口:在if __name__ == '__main__':中,首先调用download_list函数获取下载任务列表,然后使用ThreadPoolExecutor创建线程池,最大线程数为10。遍历download_lists中的每个任务,使用executor.submit方法提交下载任务给线程池。

这段代码实现了并发下载多个文件的功能,通过多线程的方式加速文件下载过程。需要注意的是,在使用多线程下载时,要注意设置适当的线程数,以避免对目标服务器造成过多的并发请求。同时,也要注意文件保存路径的创建,确保保存文件的目录存在。

import requests
import os
from concurrent.futures import ThreadPoolExecutor
 
# 青少年读本文件列表
url = 'https://s-file-1.ykt.cbern.com.cn/reading/api/zh-CN/14fba334-5e8b-4523-8b60-1f3abde6f60c/elearning_library/v1/libraries/42b4e538-7319-47cb-9d10-12fb58b78420/contents/actions/full/adapter/f848d8b521af3a6c13474ae97d117e7f428208b77884aa2dd46599d81a4ae1a5/files/0.json'
# 下载目录
download_dir = './ebooks'
# 下载集合
download_lists = []
 
 
def download_list():
    response = requests.get(url).json()
    for item in response:
        # 拼接文件访问地址
        file_url = f"https://s-file-1.ykt.cbern.com.cn/reading/api_static/smart_ebooks/{item['unit_id']}.json"
        # 获取文件真实下载链接
        download_url = requests.get(file_url).json()['ebook_third_file']
        # 拼接文件完整保存路径
        output = f"{download_dir}/{item['tags'][0]['title']}/{item['title']}.pdf".replace(' ', '') \
            .replace(':', '·').replace(':', '·').replace("“", "").replace("”", "")
        # 添加到下载集合
        download_lists.append((download_url, output))
 
 
def download(download_url, output):
    # 获取文件目录
    file_download_dir = os.path.dirname(output)
    # 判断目录是否存在,不存在则创建
    if not os.path.exists(file_download_dir):
        os.makedirs(file_download_dir)
    # 下载文件
    resp = requests.get(download_url)
    # 保存文件
    with open(output, 'wb') as f:
        f.write(resp.content)
        print(f"下载完成:{output}")
 
 
if __name__ == '__main__':
    download_list()
    # 多线程下载
    with ThreadPoolExecutor(max_workers=10) as executor:
        for arg in download_lists:
            executor.submit(download, *arg)
赞(0) 打赏
未经允许不得转载:UUpython » 青少年读本打包下载
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!