想通过听实时新闻来提高英语听力,学了那么多年的英语,不能落下啊,不然白费背了那么多年的单词。

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格式的更多相关文章

  1. python爬虫下载文件

    python爬虫下载文件 下载东西和访问网页差不多,这里以下载我以前做的一个安卓小游戏为例 地址为:http://hjwachhy.site/game/only_v1.1.1.apk 首先下载到内存 ...

  2. Python爬虫下载Bilibili番剧弹幕

    本文绍如何利用python爬虫下载bilibili番剧弹幕. 准备: python3环境 需要安装BeautifulSoup,selenium包 phantomjs 原理: 通过aid下载bilibi ...

  3. Python爬虫:新浪新闻详情页的数据抓取(函数版)

    上一篇文章<Python爬虫:抓取新浪新闻数据>详细解说了如何抓取新浪新闻详情页的相关数据,但代码的构建不利于后续扩展,每次抓取新的详情页时都需要重新写一遍,因此,我们需要将其整理成函数, ...

  4. Python爬虫下载美女图片(不同网站不同方法)

    声明:以下代码,Python版本3.6完美运行 一.思路介绍 不同的图片网站设有不同的反爬虫机制,根据具体网站采取对应的方法 1. 浏览器浏览分析地址变化规律 2. Python测试类获取网页内容,从 ...

  5. 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 ...

  6. python爬虫-采集英语翻译

      http://fanyi.baidu.com/?aldtype=85#en/zh/drughttp://fanyi.baidu.com/?aldtype=85#en/zh/cathttp://fa ...

  7. Python爬虫:获取新浪网新闻

    代码 #coding:utf-8 import requests from bs4 import BeautifulSoup res = requests.get("http://news. ...

  8. python 爬虫 下载图片

    import os#导入操作系统模块from urllib.request import urlretrieve#下载url对应的文件from urllib.request import urlope ...

  9. python 爬虫--下载图片,下载音乐

    #下载图片 imgUrl='http://www.pptbz.com/pptpic/UploadFiles_6909/201211/2012111719294197.jpg' r=requests.g ...

随机推荐

  1. Java 文件

    章节 Java 基础 Java 简介 Java 环境搭建 Java 基本语法 Java 注释 Java 变量 Java 数据类型 Java 字符串 Java 类型转换 Java 运算符 Java 字符 ...

  2. jmeter简单压测、下载文件

    一.jmeter做简单压测(单机) 1.添加需要压测的HTTP请求 2.添加聚合报告 3.设置压测场景 4.查看聚合报告 二.多机同时进行压测 1.在需要连接的电脑上打开jmeter  bin目录下的 ...

  3. Android明密文切换

    前言: 在我们的登录界面经常会遇到查看自己输入密码是否正确,就会用到明密文切换 正文: 我们先写出xml文件文件中的代码,不用过多解释 <EditText android:layout_widt ...

  4. s5pc100开发板网卡驱动的移植

    相关软件下载地址:http://pan.baidu.com/s/16yo8Y fsc100开发板 交叉编译工具:arm-cortex_a8-linux-gnueabi-gcc 平台代码修改 vim   ...

  5. REST接口

    全名是Representational State Transfer REST是设计风格而不是标准 建议将JSON格式作为标准响应格式 -------------------------------- ...

  6. 八、JavaScript之执行语句

    一.代码如下 二.运行结果如下 <!DOCTYPE html> <html> <meta http-equiv="Content-Type" cont ...

  7. 092-PHP定义索引数组

    <?php $arr=array('name'=>'PHP','age'=>22,7=>25,33,21=>35,56); //定义一个索引数组 echo '数组$arr ...

  8. css mix-blend-mode 颜色滤镜混合模式

    CSS3混合模式种类 在CSS3混合模式中,目前仅有16种:normal,multiply,screen,overlay,darken,lighten,color-dodge,color-burn,h ...

  9. 11 数据存储(Unity3D)

    所有的游戏开发都离不开数据存储的操作,Unity3D也不例外PlayerPrefs:PlayerPrefs是Unity系统自带的的一种最简单的存储方式,数据是使用字典的方法来存储的 PlayerPre ...

  10. pop3&smtp

    pop3&smtp pop3 Post Office Protocol - Version 3 pop3协议是离线邮件协议,是客户端取邮件用的. 默认监听在TCP:110端口. POP3会话有 ...