宝宝喜欢听父母讲故事,年轻人喜欢听文章,年纪大的人喜欢听评书,很多人喜欢听不一样的东西,文案能够从文字转化成为语言说出去,那么效果肯定是大有不同。
想必在日常生活中,大家都可能关注了一些微信公众号,上面有的博主会放上一些音频内容,这样的内容不仅从感官上与读者拉近了距离,更能够让大家利用碎片化的时间进行学习,微信公众号通过向用户呈现图片、文字、音频、视频和超链接,优化了用户的阅读习惯。我们可以根据自己的喜好有选择地阅读。同时,信息获取方便,成本低,体验更好。
但是有的时候,我们刚接触了一个新的公众号,看着里面发布的几百条甚至几千条的音频,想逐个听取,但是来回翻动很是麻烦,于是就
首先我们找到该公众号所属的话题,如下:
https://mp.weixin.qq.com/mp/appmsgalbum?search_click_id=9603052495515652739-1665993957662-3161382796&__biz=MjM5NjAxOTU4MA==&action=getalbum&album_id=1681628721901830149#wechat_redirect
该链接包含了公众号下面前十个音频文章,在该界面我们获取到音频所属的文章链接,那么我们爬取的思路也很简单。
- 获取该话题下的所有音频链接
- 循环遍历所有音频链接
- 获取audio_id,请求对应文件接口
因每次打开只显示话题下的前十个音频文章,所以我们向下滑动,发现发送了ajax请求,这样我们模拟发送请求即可获取所有的音频链接,拿到所有的音频链接后,我们请求所有的url,获取音频文章详情中的voice_encode_fileid(audio文件ID),然后请求如下接口链接即可,如下:
https://res.wx.qq.com/voice/getvoice?mediaid=audio_id
以上就是批量爬取公众号音频的思路,具体代码如下:
import requests
import re
import json
import time
import os
class WechatAudio(object):
audio_list_url_api = "https://mp.weixin.qq.com/mp/appmsgalbum?"
audio_item_url = ""
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"
}
audio_voice_url = "https://res.wx.qq.com/voice/getvoice?mediaid="
all_audio_url = []
audio_list_url_api_param = {
"count": 10,
"begin_itemidx": 1,
"action": "getalbum",
"uin": "",
"key": "",
"pass_ticket": "",
"wxtoken": "",
"devicetype": "",
"clientversion": "",
"appmsg_token": "",
"x5": 0,
"f": "json",
}
def __init__(self, list_url):
# pass
self.first_req(list_url)
def send_request(self, url, params={}):
response = requests.get(url, params=params, headers=self.headers)
# print(response.url)
return response.content.decode("utf-8")
def first_req(self, list_url):
start_page = self.send_request(list_url)
self.audio_list_url_api_param['__biz'] = re.search(r'__biz=(.*?)&', list_url).group(1)
self.audio_list_url_api_param['album_id'] = re.search(r'album_id=(.*?)&', list_url).group(1)
self.audio_list_url_api_param['begin_msgid'] = re.findall('data-msgid="(.*)"', start_page)[-1]
links = re.findall('data-link="(.*)"', start_page)
self.all_audio_url = [link for link in links]
self.more_url_list(self.audio_list_url_api_param)
def more_url_list(self, params):
api_res = json.loads(self.send_request(self.audio_list_url_api, params))['getalbum_resp']['article_list']
for res_item in api_res:
self.all_audio_url.append(res_item['url'])
if int(api_res[-1]['pos_num']) >= 10:
self.audio_list_url_api_param['begin_msgid'] = api_res[-1]['msgid']
self.audio_list_url_api_param['begin_itemidx'] = api_res[-1]['itemidx']
time.sleep(10)
print(len(self.all_audio_url))
self.more_url_list(self.audio_list_url_api_param)
for audio_url in self.all_audio_url:
self.down_audio_file(audio_url)
time.sleep(5)
def down_audio_file(self, link_url):
dt_res = self.send_request(link_url)
voice_id = re.findall(r'voice_encode_fileid=\"(.*?)\"', dt_res)[0]
title = re.search(r"property=\"og:title\" content=\"(.*?)\"", dt_res).group(1)
audio_data = requests.get(self.audio_voice_url + voice_id)
aduio_path = "./weMp3/"
isExists = os.path.exists(aduio_path)
if not isExists:
os.makedirs(aduio_path)
print('正在下载音频:' + title + '.mp3')
with open(aduio_path+title + '.mp3', 'wb') as f:
f.write(audio_data.content)
if __name__ == "__main__":
# topic_url = input('请输入音频话题地址:')
topic_url = "https://mp.weixin.qq.com/mp/appmsgalbum" \
"?__biz=MjM5NjAxOTU4MA==&action=getalbum&album_id=1681628721901830149&scene=173"
wechatAudio = WechatAudio(topic_url)