python 爬虫下载英语听力新闻(npr news)为mp3格式
想通过听实时新闻来提高英语听力,学了那么多年的英语,不能落下啊,不然白费背了那么多年的单词。
npr news是美国国家公共电台,发音纯正,音频每日更新,以美国为主,世界新闻为辅,比如最近我国武汉发生的新型冠状病毒肺炎,每天都有涉及China,Wuhan,Coronavirus等词。
自己动手丰衣足食,以前在网上下载的各种音频都是几年前的新闻,听着感觉没多大意思,主要是没有切身了解当时的情况。
废话不多说,直接上代码:
- __author__ = "jayson"
- import requests
- import re
- from multiprocessing import Pool
- import time
- import traceback
- import sys
- import os
- import eyed3
- def download_mp3(audios, music_index, headers, already_downloads):
- try:
- date = audios[2] # 文件前添加日期,便于排序
- music_name = date + '_' + audios[0] + '.mp3'
- music_url = audios[1]
- if music_name in already_downloads: # 避免被重复下载
- print(f'{music_index}已存在,跳过下载')
- pass
- else:
- try:
- print(f'{music_index}下载中...')
- flag = 1 # 设置下载成功标志
- music_rt = requests.get(music_url, headers=headers)
- music_rt = music_rt.content # 以bytes形式接收(接收后,以二进制写入文件即下载文件。也可以通过decode来转码变换为str),.text是以str形式接收
- with open(f'.//downloads//{music_name}', 'wb') as f:
- f.write(music_rt)
- except:
- flag = 0
- print(f'{music_index}需要重新下载,或翻墙下载!') # 偶尔会存在 需要重新下载或者翻墙下载的链接,跳过,存下url
- with open('download_error_urls.txt', 'a') as f:
- write_str = music_name + ":" + music_url + '\n'
- f.write(write_str)
- pass
- if flag: # 如果下载成功,就修改音频标签
- audiofile = eyed3.load(f'.//downloads//{music_name}') # 读取文件
- audiofile.initTag() # 删除所有标签信息
- audiofile.tag.artist = u"JaysonTeng" # 参与创作的艺术家
- audiofile.tag.album = u"NPR NEWS" # 唱片集
- audiofile.tag.album_artist = u"NPR" # 唱片艺术家
- audiofile.tag.title = u"%s" % (music_name) # 标题
- audiofile.tag.track_num = 6 # 音轨编号,专辑内歌曲编号:"#"
- audiofile.tag.save() # 保存修改标签的文件
- print(f'{music_index}下载完成!')
- except: # 捕获异常,写入文件
- error_info = sys.exc_info()
- with open('download_error.txt', 'a') as f:
- f.write(music_name + ',' + time.strftime("%Y-%m-%d %H:%M:%S") + ':\n')
- print(error_info[0], ':', error_info[1], '\n', file=f)
- traceback.print_tb(error_info[2], file=f)
- f.write('\n' + '=' * 50 + '\n')
- if __name__ == '__main__':
- url = 'https://www.npr.org/proxy/listening/v2/recommendations?channel=cleplayer' # 每日更新音频的链接(40个左右链接),早上和晚上八九点左右更新最多,其他时间会更新少量
- headers = {
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
- }
- rt = requests.get(url, headers=headers)
- rt =rt.text
- audio_orurls = re.findall('title":"(.*?)","audioTitle.*?"date":"(.*?)T.*?audio\\\\\/mp3","href":"(.*?mp3)\?', rt, re.S) # 获取音频下载链接、标题、日期
- audio_urls = []
- for mus_ora in audio_orurls:
- title = mus_ora[0].replace('\/', ' ').encode('utf-8').decode('unicode_escape').replace('\\', '').replace(':', ':').replace('?', '?').replace('<', '《').replace('>', '》').replace('*', ' ').replace('\"', '\'').replace('|', ' ') # 处理不规范的字符,windows文件名不支持部分特殊字符
- title = title[:-3] + title[-3:].replace(' ', '').replace('.', '')
- date = mus_ora[1].replace('-', '')
- url = mus_ora[2].replace('\\', '')
- audio_urls.append([title, url, date])
- already_downloads = os.listdir('.//downloads')
- pool = Pool(6) # 采用多进程进行下载(注意windows系统 jupyter里面不能用多进程),若不想用多进程,可以直接调用download_mp3函数即可
- for music_index, audios in enumerate(audio_urls):
- pool.apply_async(download_mp3, (audios, music_index, headers, already_downloads))
- time.sleep(0.5) # 各个进程之间有个时间差,避免一个ip同时访问多个连接失败
- pool.close()
- pool.join()
python 爬虫下载英语听力新闻(npr news)为mp3格式的更多相关文章
- python爬虫下载文件
python爬虫下载文件 下载东西和访问网页差不多,这里以下载我以前做的一个安卓小游戏为例 地址为:http://hjwachhy.site/game/only_v1.1.1.apk 首先下载到内存 ...
- Python爬虫下载Bilibili番剧弹幕
本文绍如何利用python爬虫下载bilibili番剧弹幕. 准备: python3环境 需要安装BeautifulSoup,selenium包 phantomjs 原理: 通过aid下载bilibi ...
- Python爬虫:新浪新闻详情页的数据抓取(函数版)
上一篇文章<Python爬虫:抓取新浪新闻数据>详细解说了如何抓取新浪新闻详情页的相关数据,但代码的构建不利于后续扩展,每次抓取新的详情页时都需要重新写一遍,因此,我们需要将其整理成函数, ...
- Python爬虫下载美女图片(不同网站不同方法)
声明:以下代码,Python版本3.6完美运行 一.思路介绍 不同的图片网站设有不同的反爬虫机制,根据具体网站采取对应的方法 1. 浏览器浏览分析地址变化规律 2. Python测试类获取网页内容,从 ...
- Python爬虫下载酷狗音乐
目录 1.Python下载酷狗音乐 1.1.前期准备 1.2.分析 1.2.1.第一步 1.2.2.第二步 1.2.3.第三步 1.2.4.第四步 1.3.代码实现 1.4.运行结果 1.Python ...
- python爬虫-采集英语翻译
http://fanyi.baidu.com/?aldtype=85#en/zh/drughttp://fanyi.baidu.com/?aldtype=85#en/zh/cathttp://fa ...
- Python爬虫:获取新浪网新闻
代码 #coding:utf-8 import requests from bs4 import BeautifulSoup res = requests.get("http://news. ...
- python 爬虫 下载图片
import os#导入操作系统模块from urllib.request import urlretrieve#下载url对应的文件from urllib.request import urlope ...
- python 爬虫--下载图片,下载音乐
#下载图片 imgUrl='http://www.pptbz.com/pptpic/UploadFiles_6909/201211/2012111719294197.jpg' r=requests.g ...
随机推荐
- DEDECMS打开网站后台系统首页卡解决方法
找到根目录下(一般是dede) templets文件夹下找到index_body.htm文件,将第25行至第41行部分注释或删除 保存文件,然后再打开后台,就不会有这个问题了.
- jrebel插件的激活
转 jrebel idea插件激活,亲测可用: 在jrebel server处,写上: http://139.199.89.239:1008/88414687-3b91-4286-89ba-2dc81 ...
- P 1032 挖掘机技术哪家强
转跳点:
- POJ 1185:炮兵阵地
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21366 Accepted: 8280 Description ...
- Egret Engine 2D - 遮罩
矩形遮罩 shp.mask = new egret.Rectangle(20,20,30,50); 注意如果rec发生变化,需要重要将rec赋值给shp.mask 删除遮罩的方法 sprite ...
- JS图片多个上传,并压缩为Base64
首先是JS 批量上传 HTML <div id="Pic_pass"> <p style="font-size: 20px;font-weight: b ...
- 【LeetCode 】N皇后II
[问题]n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法.给定一个整数 n,返回 n 皇后不同的解决方案的数量. 示例: ...
- x++ 与 ++x的区别
相信在很多编程语言中都会遇见这个问题,这对于刚入编程的人来说可能是相当懵逼了. 老师的官方说法是:操作符在前面先进行自身运算,再进行其他运算:操作符在后面,先进行其他运算再进行自身运算. 反正我这段话 ...
- JS隔行换色和全选的实现
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- linux服务重启命令
/etc/init.d/sshd restart/etc/init.d/sshd reload systemctl status sshd.servicesystemctl restart sshd. ...