栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

批量爬取微信公众号下的音频

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

批量爬取微信公众号下的音频

本文是使用python对微信公众号的音频进行批量下载到本地,工作流程如下:

获取音频的url:

首先需要注册一个微信公众号 ,在电脑端搜索微信公众平台进行注册,注册完成后页面如下:

点击转载,在页面中点击超链接:

在超链接中输入你想要爬取的公众号:

 

点击公众号后会出现公众号发布的文章列表,随便点击一个可以进行了解:

按下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)

运行结果截图:

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/961315.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号