如何使用Python下载Changelog.com的播客

如果像一样喜欢在手机上离线收听播客,可能会发现很多网站并没有提供直接的下载按钮,这迫使不得不手动寻找文件。最近,在访问Changelog.com的播客时遇到了这个问题,所以决定编写一个小型的控制台应用程序,直接将mp3文件下载到磁盘上。

前提条件:这将是一个相对简单但仍然有用的教程。要跟上,只需要一个PythonIDE和基本的Python技能。可以在GitHub页面上找到项目的完整源代码。

准备解决方案

由于即将编写的是一个相当小的控制台应用程序,决定将所有内容都放在一个文件中。首先,创建一个名为changelog_mp3.py的空文件。为了使其可执行,应该在文件顶部添加标准的Pythonshebang:

#!/bin/python3

分析Changelog.com

在Changelog概览页面上,会发现有几个播客类别可供选择。一旦打开感兴趣的类别并选择一个播客,将看到一些关于播客的信息和一个在线播放器。要获取实际的mp3文件,必须右键点击播放按钮,并在新标签页中打开链接。看看URL,将看到想要下载的文件,例如JS Party播客的js-party-25。

可以以类似的方式获取其他播客的基础URL,这使能够为所有播客初始化一个数组:

base_urls = [ 'https://cdn.changelog.com/uploads/podcast//the-changelog-.mp3', 'https://cdn.changelog.com/uploads/gotime//go-time-.mp3', 'https://cdn.changelog.com/uploads/rfc//request-for-commits-.mp3', 'https://cdn.changelog.com/uploads/founderstalk//founders-talk-.mp3', 'https://cdn.changelog.com/uploads/spotlight//spotlight-.mp3', 'https://cdn.changelog.com/uploads/jsparty//js-party-.mp3', ]

让进入这个程序的核心:下载播客的代码。所有的魔法都将发生在下面的download_podcasts方法中:

def download_podcast(podcast_id): base_url = base_urls[podcast_id - 1] print("Enter one or more episodes to download:") episodes = (int(x) for x in input().split(',')) target = '/home/philipp/Downloads/' for episode in episodes: download_url = base_url.replace('', str(episode)) print(f'Downloading episode {episode} to {target}') try: urllib.request.urlretrieve(download_url, target + download_url.split('/')[ -1 ]) print('Download complete!') except: print(f'Could not download file: {download_url}')

方法的唯一参数是podcast_id,它告诉程序应该下载哪个类别的播客。接下来,要求用户输入一个或多个他们想要下载的剧集编号,并定义mp3文件的目标文件夹。

在下面的for循环中,简单地遍历所有选定的剧集,用剧集编号替换‘id’占位符,这样就得到了一个有效的URL,最后下载文件。由于使用的是urllib库,必须在文件顶部添加一个import语句:

import urllib.request

主函数

这就是需要从Changelog.com下载并存储为mp3文件的所有内容。要调用新代码,在main方法中实现了一个简单的控制台UI:

def main(): print('Which podcast would you like to download?') print('(1) - The Changelog') print('(2) - Go Time') print('(3) - Request for Commits') print('(4) - Founders Talk') print('(5) - Spotlight') print('(6) - JS Party') n = int(input()) download_podcast(n) if __name__ == "__main__": main()
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485