首先需要注册一个微信公众号 ,在电脑端搜索微信公众平台进行注册,注册完成后页面如下:
点击转载,在页面中点击超链接:
在超链接中输入你想要爬取的公众号:
点击公众号后会出现公众号发布的文章列表,随便点击一个可以进行了解:
按下F12,在右侧窗口选择以下几个选项:
点击播放音频后在右侧窗口即会捕获该资源,查看该资源会发现该音频的url,通过该链接可以直接获取该音频,那么怎样批量获取音频呢?我们肯定需要这一批音频的url,通过该url我们可以发现,每一个音频url的区别在于mediaid,那我们主要需要去寻找怎样能获取批量的mediaid。
在这个实例中博主爬取罗胖60秒,它有音频的合集,在合集页面按F12会出现本页面的html,那么在这个页面中会有这些音频的url:
依次点击上图的两个位置,注意,第二个位置需要点击这一行的盒子,因为我们要找的是这一个小li的位置,点击之后会自动到该元素所在的位置,而其余的小li(音频)会与其并排,他们都同属于album_list js_album_list类的,我们就可以找到他们的结构了:
在右侧就出现了它的结构,可以点开看看是什么样的,在本次实例中主要是获取每一个音频的url,所以我们先找url,在字段中可以看到, 每一个li代表一个音频,对应有音频的data-voiceid,看着这个第990个音频的data-voiceid,怎么有点熟悉呢?没错!它就是我们上面看的实例也是第990个罗胖60秒文章里的音频url的mediaid,真相大白啦,现在我们只需要将这个汇总页面里的每一个小li里的data-voiceid爬出来然后加上网址就可以获取每一个音频啦!
怎么获取呢,博主是将这个html页面获取到本地,然后通过python的bs4包的BeautifulSoup函数将获取的html转化为容易获取信息的树状结构,在获取树状结构后,因为他们都同属于album_list js_album_list类,我们只需要通过select这个类下面的li即可获取每一个li的内容,li_list将会得到一个包含所有的li内容的列表,遍历每一个li的内容获取对应的音频id并通过url将音频下载到本地:
获取每一个小li的内容,得到一个列表:headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'}
response1 = requests.get(url='https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MjM5NjAxOTU4MA==&action=getalbum&album_id=1777378132866465795&scene=173#wechat_redirect',headers=headers)
response1.encoding = 'utf-8'
html = response1.text # 读取文件
soup = BeautifulSoup(html, 'lxml') #html是汇总音频的html的字符串形式
li_list = soup.select(".album__list.js_album_list > li") # select返回的是列表
获取完整url并下载到本地:
for li in li_list:
#音频地址
chapter_url = str(li['data-voiceid'])
# print(chapter_url)
sequence = li.find(class_='album__item-title').text
# print(sequence)
temp_seq=''
flag=0
for c in range(len(sequence)): #获取音频文件序号
if str.isdigit(sequence[c]) and flag==0:
flag+=1
while True:
if c!=len(sequence) and str.isdigit(sequence[c]):
temp_seq+=sequence[c]
c+=1
else:
break
url = 'https://res.wx.qq.com/voice/getvoice?mediaid=' + chapter_url
# MP3文件名
file_name = temp_seq + '.mp3'
DownloadFile(url, save_url, file_name)
完整代码:
# 下载MP3文件到本地
import os
import requests
from bs4 import BeautifulSoup
def DownloadFile(mp3_url, save_url,file_name): #下载音频文件
try:
if mp3_url is None or save_url is None or file_name is None:
print('参数错误')
return None
# 文件夹不存在,则创建文件夹
folder = os.path.exists(save_url)
if not folder:
os.makedirs(save_url)
# 读取MP3资源
res = requests.get(mp3_url,stream=True)
if str(res)[-5:-2]=='200':
file_path = os.path.join(save_url, file_name)
print('开始写入文件:', file_path)
# 打开本地文件夹路径file_path,以二进制流方式写入,保存到本地
with open(file_path, 'wb') as fd:
for chunk in res.iter_content():
fd.write(chunk)
print(file_name + ' 成功下载!')
else:
print(str(res)[-5:-2])
# print('获取为:{}'.format(res))
# 获取文件地址
except:
print("程序错误")
if __name__ == "__main__":
# MP3保存文件夹
save_url = 'D:/music/'
i = 1
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'}
response1 = requests.get(
url='https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MjM5NjAxOTU4MA==&action=getalbum&album_id=1777378132866465795&scene=173#wechat_redirect',
headers=headers)
response1.encoding = 'utf-8'
html = response1.text # 读取文件
soup = BeautifulSoup(html, 'lxml') #html是汇总音频的html的字符串形式
li_list = soup.select(".album__list.js_album_list > li") # select返回的是列表
for li in li_list:
#音频地址
chapter_url = str(li['data-voiceid'])
# print(chapter_url)
sequence = li.find(class_='album__item-title').text
# print(sequence)
temp_seq=''
flag=0
for c in range(len(sequence)): #获取音频文件序号
if str.isdigit(sequence[c]) and flag==0:
flag+=1
while True:
if c!=len(sequence) and str.isdigit(sequence[c]):
temp_seq+=sequence[c]
c+=1
else:
break
url = 'https://res.wx.qq.com/voice/getvoice?mediaid=' + chapter_url
# MP3文件名
file_name = temp_seq + '.mp3'
DownloadFile(url, save_url, file_name)
for li in li_list:
#音频地址
chapter_url = str(li['data-voiceid'])
# print(chapter_url)
sequence = li.find(class_='album__item-title').text
# print(sequence)
temp_seq=''
flag=0
for c in range(len(sequence)): #获取音频文件序号
if str.isdigit(sequence[c]) and flag==0:
flag+=1
while True:
if c!=len(sequence) and str.isdigit(sequence[c]):
temp_seq+=sequence[c]
c+=1
else:
break
url = 'https://res.wx.qq.com/voice/getvoice?mediaid=' + chapter_url
# MP3文件名
file_name = temp_seq + '.mp3'
DownloadFile(url, save_url, file_name)
运行结果截图:



