使用splinter+requests批量下载微信公众号中的音频文件
发表时间:2020-10-19
发布人:葵宇科技
浏览次数:44
需求分析
晚上老妈微信上给发了个豫剧公众号的链接,要我帮她下载到U盘上
打开看了下,页面还比较规矩,可以直接用CSS选择器晒出来列表链接地址,再进行遍历获取.
这里遇到一个小坑:公众号中内嵌音频文件不会直接在页面中加载<audio>
标签,只有在点击播放按钮后才会出来,所以就不能直接解析HTML页面了,用splinter
来操作Chrome模拟鼠标点击后再解析页面就可以咯。代码没几行,直接看注释就可以了。
环境依赖
- Python 3.6+
- requests
- splinter
- chromedriver(需要与安装的Chrome大版本一致)
运行效果
完整代码
import os
import requests as rq
from splinter import Browser
BASE_URL = 'https://mp.weixin.qq.com/s?__biz=MzU2OTI3NjQ4OA==&mid=100000538&idx=1&sn=419a647c0372d7630a197db9454bddc6&chksm=7c80623d4bf7eb2bca0756d63ee7250807d225a1fffe475db317d7c745b51074e5cc58b3e607&mpshare=1&scene=2&srcid=11076nyob9dLyKeQrFDgcnwY&sharer_sharetime=1565615878241&sharer_shareid=80ca6d7f86bae39e4b8264e1365d4b6a&from=timeline&clicktime=1565621528&key=0053416997e154650cb74184219ffa63550a1b3adf6c5c6bc705442434f0b0d05fbbe8217ed41a8f0f9165a2008bacbba44b624f535047b02cff8b47d698619ce97e48cf5663091b25deb3276764083a3719066790537f1813f0d7e3d5b6ae32fcc8cc3e49633034326feda342a8772d88981eedb113ea9a491c345c07ab271e&ascene=1&uin=MTY3NjYy&devicetype=Windows+10+x64&version=62090529&lang=zh_CN&exportkey=AaZhp%2BDCkmag01n7EMTREmg%3D&pass_ticket=hbFyRKZiXYK0ETPppZH0Xbwm2Tnpv7pFXeyOGE846fyLoLRcyDdPwaWI4mjwJzSu&wx_header=0'
bro = Browser('chrome')
if __name__ == '__main__':
# 访问目标页面
bro.visit(BASE_URL)
# 获取所有列表DOM
links = bro.find_by_css('a[data-linktype="2"]')
# 由于后面需要进行页面跳转,所以先将列表信息解析后存到数组变量中
tasks = []
for link in links:
if link.text:
tasks.append({
'title': link.text,
'url': link['href']
})
# 开始遍历任务
for i, t in enumerate(tasks):
filename = t['title']
filepath = os.path.join(os.getcwd(), 'mp3', f'{filename}.mp3')
print(f'正在下载\t{i}/{len(tasks)}\t{filename}')
bro.visit(t['url'])
# 微信公众号页面中的音频文件只有在点击了开始播放后才会在HTML中加载出来<audio>标签
bro.find_by_css('.audio_card_switch').click()
audio_src = bro.find_by_tag('audio')['src']
# 用requests直接下载到文件
open(filepath, 'wb').write(rq.get(audio_src).content)
bro.quit()
print('任务完成')