关于python的日常使用,从我本人来讲更倾向于与我本职工作能结合,因此我前面很多期都在讲文件的批量操作、pdf的 OCR 识别、有限元软件二次开发等等,基本没有对Python爬虫功能的介绍。
但python的爬虫功能,是python最大的用处之一,以至于用的太多导致现在很多网站开发出“反爬虫”功能,也使得“爬虫”与“反爬虫”在轮番的PK较量中左脚踩右脚一样进入新次元。
我今天写这一期,主要是因为最近在某播客上想要下载一些音频,但想利用python完成整个合集的批量下载和mp3转换。完成以后觉得很方便,所以这一期准备给大家介绍下我完成的过程。注:这一期内容仅限交流使用心得。
本期目录
1. 爬虫的使用场景
2. 如何获取播客的“真实地址”
3. python爬虫的“关键库”
4. 核心代码拆解
5. 总结
初期爬虫主要用来爬取网页中的有用信息,即所见即所得,而目前爬虫使用的场景也与时俱进了,比如:用于AI 语料库与 RAG 知识库构建 (The AI Feed),这个也很好理解,就是辅助AI批量抓取行业垂直网站、技术文档和政策报告,feed AI;另外用的比较多是商业情报与动态价格监测,这种商业用途往往还依赖后续的数据分析处理;还有就是很多旧系统或网站没有提供正式的 API 接口,可以用爬虫创造“影子 API”,将A网站抓取的内容自动同步到另外一个终端进行调用。
其实爬虫也并不拘于使用哪一种语言,任何语言都可以爬取内容,我以前也使用过VBA爬取网站上的表格导入到EXCEL里。但python的优势在于,它有大量现成的库,可以直接完成网页的爬取和处理,也有现成的库可以对爬取的数据完成后续的处理和分析,现成嘛就是最好的。
Python爬虫可以实现的功能:
规范与标准信息、工程材料与信息价、招投标信息、文献与专利信息、技术方案调研等,通过爬虫获取网站的最新信息,更新终端的数据库,这些都是爬虫最基本的功能。当然,也可以通过爬虫控制多个网站,一键实现多网站关键词检索,现在具备这种功能的插件也很多。
规范图集下载、播客音频、网络视频、高德谷歌卫星切片、公开数据等,本质上是利用爬虫的『路径自动遍历』 + 『资源批量获取 』+ 『自动化重命名』。
对于播客来说,爬虫实际上利用的是通过“抓包”的方式,截取音频播放的真实地址。后面我们继续介绍“抓包”的方法。
其实,无论播客还是视频网站,播放页面只是一层“皮”,真正的音频、视频文件地址隐藏在网页背后的请求中。
通过浏览器自带的F12『开发模式』,切换到 Network『网络』标签页,在其中搜索 .mp3、.m4a 或查看 Media 分类,就可以看到媒体的真实地址。
而python爬虫利用的就是截取这个地址,再利用批量化操作实现批量下载。
现在有很多播客平台提供 RSS 订阅源,这是一个规范的 XML 文件,对于爬虫开发者来说,RSS(Really Simple Syndication)订阅源就像是网站主动准备好的“标准化数据包”,即使频繁访问也不会触发“反爬机制”。从效率的角度看,如果一个平台能提供 RSS,绝对不要去写 HTML 爬虫。
当然,这次我使用的是 HTML 爬虫,因为我做的这个程序兼容多个播客网站,需要具备通用性。
python用于爬虫的第三方库非常多,具体要看采用的爬虫策略,爬取的网页是否有反爬措施,我这里着重介绍重要的以及我这次采用的第三方库:
这是所有爬虫的基石,负责把网页的源代码爬下来,因此可以完成一些简单的网页操作、静态网页的爬取,上限比较低但很实用。前面看过我文章的应该也眼熟,没错,就是API调用时,我们也用过它。
当然,单纯靠 requests 是不可能把播客内容下载下来的,我们这里使用它主要还是获取播客网页中的基本信息,一次性提取整个专栏 album 的条目,用于替代 RSS 的索引功能。
Beautiful Soup是最常用的python网页解析库之一,非常直观,可以将 HTML 和 XML 文档解析为树形结构,能更方便地识别和提取网页内的数据。
这个属于高级库,用于大规模分布式爬虫,稳定性强,可以理解为建立了一个能够持续运行、多线程并发的“爬虫工厂”,这个大家理解就好,基本上我们这种业余选手也没有什么机会使用。
这个才是我这次使用的爬虫工具,其实 yt-dlp 不属于上述这种基础功能库,而是一个已经组装好的工具,专门用于下载各类网站上的“音频和视频”,具体包括哪些网站,感兴趣的可以自行搜索下,基本囊括了所有流媒体网站。
yt-dlp的工作流如下:模拟请求 - 数据解析 - 流媒体处理(格式转换等),涵盖了我们爬取目标的全过程。
这不是唯一和最优的办法,但是是通用性最好的办法,几乎所有的播客都可以通过这种方式获取网页信息:
def get_xiaoyuzhou_data(podcast_url): """手动抓取主页,提取播客名字和所有单集链接""" print(f"--- 正在尝试拉取主页数据 ---") headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } response = requests.get(podcast_url, headers=headers) response.raise_for_status() html = response.text # 1. 提取播客标题 title_match = re.search(r'<meta property="og:title" content="(.*?)"', html) podcast_title = title_match.group(1) if title_match else "未知播客" # 2. 提取所有单集ID eids = re.findall(r'"eid":"([a-f0-9]{24})"', html) # 去重并保持网页上的顺序 unique_eids = list(dict.fromkeys(eids)) return podcast_title, unique_eids
通过循环函数逐个下载,注意要使用 sleep() 函数适当降低下载频率,防止被X:
for i, eid in enumerate(current_batch): actual_index = start_idx + i # 拼装出 yt-dlp 认识的单集链接! track_url = f"https://www.xiaoyuzhoufm.com/episode/{eid}" print(f"进度: [{actual_index}/{end_val}] 准备获取音频...") download_opts = {'format': 'bestaudio/best','outtmpl': os.path.join(album_folder, "%(title)s.%(ext)s"),'download_archive': archive_file,'postprocessors': [{'key': 'FFmpegExtractAudio','preferredcodec': 'mp3','preferredquality': '192', }],'ignoreerrors': True,'quiet': True, 'no_warnings': True, }try: with yt_dlp.YoutubeDL(download_opts) as ydl_dw: ydl_dw.download([track_url]) time.sleep(1.5) # 防封号休眠 except Exception as e: print(f"下载第 {actual_index} 集时出错: {e}")
其他就是注意,在程序中设置一个限定下载范围的函数,人为控制下载的集数,防止程序一次性把 album 里全部的音频都下载下来,耗时耗力。
今天,我们介绍了如何使用“爬虫”批量下载播客内的音频,“爬虫”是个很好的工具,可以提高我们获取信息的效率。但“爬虫”也是一种粗暴获取资源的方式,因此现在各大网站对此行为都有所限制,也可能会涉及一些侵权的行为,所以大家在使用时都应该谨慎一点。
我个人觉得“爬虫”最大的用途,除了爬取信息,最重要的是和后续的处理 — 格式转换、数据分析、文件处理等结合起来,才能发挥python更大的作用,这个也是我使用python最重要的用途。
这一期就到此为止,如果你也对Python编程技巧和应用实例感兴趣,欢迎点赞,收藏,关注,我将以应用案例为基础持续更新公众号文章。你也可以在公众号后台,获取Python编程的经典资料,也可以与我私信交流想法和需求,我们下期再见~
Rushing towards the mountains and wilderness.Put down the pursuit footsteps.