如何用Python 3.11从JSON中提取并下载指定集数的视频文件?
解决方案
问题分析
你的代码目前仅实现了视频链接提取,缺少下载功能,同时存在API数据结构访问路径错误的问题(Anilibria API的剧集资源路径并非entry['episode'])。
修改后的完整代码
import requests from pathlib import Path def download_video(url, save_path): # 流式下载大视频文件,避免内存占用过高 with requests.get(url, stream=True) as r: r.raise_for_status() with open(save_path, 'wb') as f: for chunk in r.iter_content(chunk_size=8192): f.write(chunk) print(f"视频已保存至: {save_path}") user_input = input("输入动漫名称: ") url = f'https://api.anilibria.tv/v3/title/search?search={user_input}' res = requests.get(url) res.raise_for_status() data = res.json() titles_and_links = [] for entry in data['list']: try: title = entry['names']['ru'] # 精准定位第1集:按需选择以下两种方式 # 方式1:按列表顺序取第一个(默认对应第1集) first_episode = entry['player']['episodes'][0] # 方式2:通过episodeNumber字段精准匹配第1集 # first_episode = next(ep for ep in entry['player']['episodes'] if ep['episodeNumber'] == 1) # 获取FHD清晰度的视频链接 video_link = first_episode['sources']['fhd'] data_item = { 'title': title, 'video_link': video_link } titles_and_links.append(data_item) except KeyError as e: print(f"跳过条目:缺失数据 - {e}") except StopIteration: print(f"跳过条目:未找到第1集") # 遍历结果并下载 for item in titles_and_links: print(f"标题: {item['title']}") print(f"视频链接: {item['video_link']}") # 构造保存文件名,可按需调整编码避免乱码 save_filename = f"{item['title']}_第1集.mp4" save_path = Path(save_filename) download_video(item['video_link'], save_path) print()
关键修改点
- 修正API数据路径:Anilibria API中,剧集资源存储在
entry['player']['episodes']路径下,每个剧集的清晰度链接在sources字段内。 - 添加流式下载功能:使用
stream=True分块写入文件,适合大体积视频,防止内存溢出。 - 精准匹配第1集:提供两种集数定位方式,可根据API返回的剧集排列情况选择。
- 友好的文件命名:用动漫标题+集数作为保存文件名,方便识别。
内容的提问来源于stack exchange,提问作者Molix228
相关产品推荐
相关产品推荐

