爬取听力音频并整合
初愿:最近心态发生了小小的变化,决定准备一年时间后考雅思,英语也是该断断续续拾起来了。
资源:找寻了一番后发现这个网站http://www.kekenet.com/上的听力资源不错,内容也挺全面。毕竟我还是倾向于把英语当作一种能力培养,而不是仅为了应试。挑挑拣拣后决定先从演讲部分听起来吧
至于爬取它的原因就是,它把一整个演讲分成了几个部分,虽然可以下载下来,但是不舒服,有时候也是乱序播放,就打算把演讲爬取下来,然后整合成一个音频,多好
目的分析
首先,打开该部分的第一页内容:http://www.kekenet.com/Article/15206/List_1.shtml
可以看到每篇演讲的小部分标题几乎一样,除了后面的编号不同。
按F12,分析一波先
可以轻易找到每部分的链接
本文以雪莉桑德伯格哈佛大学2014毕业典礼演讲为例
第一步,考虑的是如何确定它有多少个小部分,即如何找到它的所有部分。
这里我选择的是用正则匹配标题,即包含“雪莉桑德伯格哈佛大学2014毕业典礼演讲”这些字样的标签下的链接才是我需要的
找到需要的标签后就可以很自然地提取链接,但需要有一点注意,需要重新排序,以利于后面的音频整合。
代码实现
import requests
from bs4 import BeautifulSoup
import re
import pydub
mode = r'雪莉桑德伯格哈佛大学2014毕业典礼演讲'
headers = {'user-agent': 'Mozilla/5.0'}
url = 'http://www.kekenet.com/Article/15206/List_1.shtml'
res = requests.get(url, headers)
res.encoding = res.apparent_encoding
soup = BeautifulSoup(res.text, 'html.parser')
file_list = soup.find('ul', id='menu-list').find_all('li')
mp3_list = []
for file in file_list:
title = file.find('h2').find('a')['title']
if re.search(mode, title, re.S) is not None:
link = file.find('h2').find('a')['href']
re_link = (str(link)).replace('Article', 'mp3')
mp3_list.append(re_link)
mp3_list.sort()
# 爬取音频内容
download_mode = r'href="(http://k6.kekenet.com/Sound/.+?.mp3)"'
num = 0
for i in mp3_list:
num += 1
res1 = requests.get(i, headers)
res1.encoding = res1.apparent_encoding
l1 = re.search(download_mode, res1.text, re.S)
content = requests.get(l1.group(1), headers)
with open('雪莉桑德伯格哈佛大学2014毕业典礼演讲%d.mp3' % num, 'wb') as mp3:
mp3.write(content.content)
# 合并音频
m1 = pydub.AudioSegment.from_mp3(r'雪莉桑德伯格哈佛大学2014毕业典礼演讲1.mp3')
m2 = pydub.AudioSegment.from_mp3(r'雪莉桑德伯格哈佛大学2014毕业典礼演讲2.mp3')
m3 = pydub.AudioSegment.from_mp3(r'雪莉桑德伯格哈佛大学2014毕业典礼演讲3.mp3')
m4 = pydub.AudioSegment.from_mp3(r'雪莉桑德伯格哈佛大学2014毕业典礼演讲4.mp3')
m5 = pydub.AudioSegment.from_mp3(r'雪莉桑德伯格哈佛大学2014毕业典礼演讲5.mp3')
merge = m1 + m2 + m3 + m4 + m5
merge.export('雪莉桑德伯格哈佛大学2014毕业典礼演讲.mp3', format='mp3', bitrate='192k')
代码很简单,就无需赘述了。
踩过的坑
在使用pydub前需要安装ffmpeg,安装及配置过程网上搜即可,我要说的是,如果配置完环境变量、更改某个代码文件后还是报错,试试把ffmpeg.exe, ffplay.exe, ffprobe.exe这三个文件和本脚本文件放在同一目录下