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

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. python中excel表格的读写

    #!usr/bin/env python #-*- coding:utf-8 -*- import xlrd import xlwt from xlutils.copy import copy imp ...

  2. Day 28:SAX解析原理

    SAX解析 回顾DOM解析 DOM解析原理:一次性把xml文档加载进内存,然后在内存中构建Document树. 缺点: 不适合读取大容量的xml文件,容易导致内存溢出. SAX解析原理: 加载一点,读 ...

  3. 关于连接查询主要是左右连接查询中,where和on的区别

    工作中,今天用到左连接查询,我自己造的数据,需要根据条件进行筛选,但是筛选不符合我的要求,最终发现是左右连接中where和on的区别,在作怪,工作中用的表关联太多,我下面简化要点,仅仅把注意点写个简单 ...

  4. HDOJ 1722--Cake(切蛋糕问题)

    一次生日Party可能有p人或者q人参加,现准备有一个大蛋糕.问最少要将蛋糕切成多少块(每块大小不一定相等),才能使p人或者q人出席的任何一种情况,都能平均将蛋糕分食. Input 每行有两个数p和q ...

  5. oracle中判断"非"

    在oracle中判断为"非"最常见的两种情况,一个是"不等于",一个的"非空". 通过查找资料得知,oracle中判断不等于的方法有好多种: ...

  6. 逆向-PE导入表

    导入表 动态链接库需要导入表 结构 typedef struct _IMAGE_IMPORT_DESCRIPTOR { union { DWORD Characteristics; // 0 for ...

  7. ACM-数细胞

    题目描述:数细胞 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数.编程需要用到的队列及其相关函数已经实现,你只需要完成 ...

  8. bash 内嵌命令 printf 用于进制转换

    printf - 格式化并显示数据 printf "%d" 0x10 printf "%x" 16

  9. 在登陆退出时候使用Vuex

    1.登陆的时候,在登陆模块请求接口,然后获取一个access_token,获取用户权限.保存到缓存里面. 2.退出的时候,请求退出接口,把缓存里面的access_token清除. 一旦要在登陆里面做一 ...

  10. springmvc(@ResponseBody)无法跳转到对应的jsp页面

    项目框架:spring+springmvc+mybatis 问题描述:Controller返回jsp页面名称后,前端无法跳转到该页面,而是将该jsp名称打印到前端页面 前端异常信息:无 后端异常信息: ...