基于上一篇的介绍,想必大家都学会了如何爬取一位歌手的热门50首歌的歌词了,但是输出的结果在命令行里面,可能我们希望能不能将爬取的歌词内容保存为文本格式并存储起来呢,那么今天我们介绍如何将爬取的内容作为一个文本保存。
先将我们上一篇爬取热门50首歌的代码写上

import requests
import json
import re
from bs4 import BeautifulSoupdef download_by_music_id(music_id):#根据歌词id下载url = 'http://music.163.com/api/song/lyric?'+ 'id=' + str(music_id)+ '&lv=1&kv=1&tv=-1'r = requests.get(url)json_obj = r.textj = json.loads(json_obj)lrc = j['lrc']['lyric']pat = re.compile(r'\[.*\]')  #这里几行代码是把歌词中的空格和符号之类的去掉lrc = re.sub(pat,"",lrc)  lrc = lrc.strip()return lrcdef get_music_ids_by_musican_id(singer_id): #通过一个歌手id下载这个歌手的所有歌词singer_url = 'http://music.163.com/artist?'+ 'id='+str(singer_id)r = requests.get(singer_url).textsoupObj = BeautifulSoup(r,'lxml')song_ids = soupObj.find('textarea').textjobj = json.loads(song_ids)for item in jobj:print(item['id'])print(download_by_music_id(item['id']))get_music_ids_by_musican_id(2116) #括号内为歌手id

现在我们想建立一个文件夹,文件夹的名称或许可以用歌手的id名,然后把50首歌依次用TXT文本格式保存,文本的名称用歌曲的名称。

我们可以有下面大概的思路
1.先创立一个字典,用歌曲的名称索引歌曲的id
2.然后在函数中将这个字典返回
3.建立一个将下载好的歌词依次保存为文本格式的函数
4.调用函数保存歌词到本地

首先需要对我们解析文本的函数进行修改,使得函数能够成功返回歌词名和歌词id的字典
定义一个字典ids:

ids = { }

遍历整个爬取出来的json格式内容,提取当中的歌词名和歌词id,并把歌词名作为歌词id的索引:

for item in jobj:ids[item['name']] = item['id']

然后将该字典作为返回值返回
字典打印出来是这样的:

{'淘汰': 65528, '不要说话': 25906124, '阴天快乐': 28563317, '好久不见': 65538, '富士山下': 65766, '可以了': 28481818, '红玫瑰(国)': 65126, '最佳损友': 65800, '浮夸': 64886, '你给我听好': 28481103, '一丝不挂': 64634, '稳稳的幸福': 25730757, '孤独患者': 64093, '陪你度过漫长岁月': 35403523, '红玫瑰': 65533, '爱情转移': 65536, '因为爱情': 64317, '倾城': 27867449, '落花流水': 64922, '爱情转移(国)': 65099, '沙龙': 64833, '苦瓜': 64293, '白玫瑰': 65761, '于心有愧': 64797, '内疚': 64126, '葡萄成熟时': 66285, '不如不见': 65769, '北京欢迎你': 5250116, '最冷一天': 186331, '心的距离': 64699, '完': 64048, '让我留在你身边': 438801672, '无条件': 31426608, '失忆蝴蝶': 27483203, '斯德哥尔摩情人': 27483204, '陀飞轮': 64638, '夕阳无限好': 66272, '好久不见(国)': 65078, '四季': 437802725, '裙下之臣': 65758, '兄弟': 65487, 'Sleep Alone': 36539010, '阿牛': 66265, '承诺(香港版)': 5251209, '梦想天空分外蓝': 25638273, '预感': 67787, '无人之境': 64625, '给你': 64706, '粤语残片': 65778, '谁来剪月光': 493283125}

嗯…….现在来构建一个将歌词保存的函数:
把它命名为download_lyric(uid)

def download_lyric(uid):os.mkdir(str(uid))os.chdir(str(uid))

这里需要用到一些OS模块关于文件操作的一些内容,在这里我就不再介绍,有兴趣的可以自行翻阅官方文档或者他人写的OS模块知识。
os.mkdir()是创建一个一级目录,这里我们用歌手的id作为文件名,所以参数为str(uid)
os.chdir()是选择当前目录,道理和上面是一样的。

然后通过上一个函数获取该歌手热门50首歌曲的字典

music_ids = get_music_ids_by_musican_id(uid)

获取字典后,依次对字典中的每一个项进行下载读入操作,
这段代码比较简单,我就先直接放上去了

for key in music_ids:text = download_by_music_id(music_ids[key])file = open(key + '.txt','a',encoding='utf-8')file.write(key +'\n')file.write(text)file.close()

其中我们希望在文本开头能将歌曲的名字写入,于是添加了下面一行代码

file.write(key +'\n')

然后当中对文件的操作就十分简单了。打开-写入-关闭

之后调用该函数,就能输出结果了。
得到的结果大概是这样的

整体代码如下:

import requests
import json
import re
from bs4 import BeautifulSoup
import osdef download_by_music_id(music_id):#根据歌词id下载url = 'http://music.163.com/api/song/lyric?'+ 'id=' + str(music_id)+ '&lv=1&kv=1&tv=-1'r = requests.get(url)json_obj = r.textj = json.loads(json_obj)lrc = j['lrc']['lyric']pat = re.compile(r'\[.*\]')lrc = re.sub(pat,"",lrc)lrc = lrc.strip()return lrcdef get_music_ids_by_musican_id(singer_id): #通过一个歌手id下载这个歌手的所有歌词singer_url = 'http://music.163.com/artist?'+ 'id='+str(singer_id)r = requests.get(singer_url).textsoupObj = BeautifulSoup(r,'lxml')song_ids = soupObj.find('textarea').textjobj = json.loads(song_ids)ids = {}for item in jobj:ids[item['name']] = item['id']return ids
def download_lyric(uid):os.mkdir(str(uid))os.chdir(str(uid))music_ids = get_music_ids_by_musican_id(uid)for key in music_ids:text = download_by_music_id(music_ids[key])file = open(key + '.txt','a',encoding='utf-8')file.write(key +'\n')file.write(text)file.close()print("请输入歌手的id:")
singer_id = input()
download_lyric(singer_id)

大家在爬取歌词的时候,可能会遇到编码或者其他错误,是因为有些歌词包含了非法字符或者是没有歌词的纯音乐,这时我们可以利用python中的try……expect语句跳过这些错误使得程序继续运行,try……expect语句是python中经常会用到的语句,有兴趣的不妨多了解一下,在后面的学习中我们也会提到的。大家国庆快乐!!

Python 3爬虫网易云(十)—— 爬取歌词读入文件存储相关推荐

  1. python处理json数据——网易云评论爬取

    python处理json数据--网易云评论爬取 准备 代码 准备 1.python 3.7 2.需要安装的库: requests jsonpath pandas time fake_useragent ...

  2. Python 小小爬虫练手,爬取自己的IP

                 Python 小小爬虫练手,爬取自己的IP import re import urllib.request url="http://2020.ip138.com/i ...

  3. 爬虫篇——代理IP爬取备用及存储

    爬虫篇--代理IP爬取备用及存储 代码 代码 本文通过抓取免费的高匿IP代理,将其写入列表并保存为json格式文件,且将代码进行了封装,方便以后抓取数据时动态的更新handle的IP地址,从一方面避免 ...

  4. [Python Scrapy爬虫] 二.翻页爬取农产品信息并保存本地

    前面 "Python爬虫之Selenium+Phantomjs+CasperJS" 介绍了很多Selenium基于自动测试的Python爬虫程序,主要利用它的xpath语句,通过分 ...

  5. python网络爬虫网易云音乐下载_python网络爬虫爬取网易云音乐

    #爬取网易云音乐 url="https://music.163.com/discover/toplist" #歌单连接地址 url2 = 'http://music.163.com ...

  6. 爬虫python代码网易云_python爬取网易云音乐热歌榜实例代码

    首先找到要下载的歌曲排行榜的链接,这里用的是: https://music.163.com/discover/toplist?id=3778678 然后更改你要保存的目录,目录要先建立好文件夹,例如我 ...

  7. Python 3爬虫网易云(八)—— 对网易云歌词的爬取

    今天开始正式的网易云爬虫的实战吧,今天先做一个非常简单的小例子,但是稍微有一点小弯绕.在这之前,想必大家也用爬虫爬过妹子图和百度贴吧入门爬虫了. 好,那么先打开网易云中的一首歌(这里以火狐浏览器为例) ...

  8. Python爬虫实战:网易云音乐爬取!

    本次目标 爬取网易云音乐 https://music.163.com/ PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资料以及群交流解答点击即可加入 环境 ...

  9. python网络爬虫网易云音乐_一篇文章带你用Python网络爬虫实现网易云音乐歌词抓取...

    标签下,如下图所示: 接下来我们利用美丽的汤来获取目标信息,直接上代码,如下图: 此处要注意获取ID的时候需要对link进行切片处理,得到的数字便是歌曲的ID:另外,歌曲名是通过get_text()方 ...

最新文章

  1. module ‘pytest‘ has no attribute ‘allure‘问题解决
  2. amd显卡风扇调节_非公版才是真爱 讯景XFX RX6800 XT海外版显卡评测
  3. Java,如果这是一个更好的世界
  4. lambda显式声明返回值
  5. 工作243:name报错
  6. PostgreSQL函数(存储过程)----笔记
  7. 在线类图各种UML图分享
  8. 苹果电脑安装计算机一级,苹果电脑安装Win10系统的详细步骤
  9. PHP LOL接口,教你如何用php实现LOL数据远程获取_PHP教程
  10. 【模拟考勤打卡程序vim报错分享】
  11. 一道被称为“神题”的试题之求熊是什么颜色的
  12. (有趣)把文字隐藏到图片中
  13. [HTML] HTML常见的元素
  14. 集合——Collections
  15. Pytorch 计算误判率,计算准确率,计算召回率
  16. canvas插件 fabric.js 使用
  17. 中文/英文 文本相似度/文本推理/文本匹配数据集汇总(SNLI、MSRP、MultiNLI、Quora、SciTail、SICK、STS、CCKS2018、LCQMC、OCNLI、XNLI)
  18. 学校校园教务老师选课排课系统 毕业设计毕设源码毕业论文参考(1)功能概要
  19. head和tail命令
  20. developerWorks 中文社区

热门文章

  1. 批处理写的系统文件替换
  2. 2020多媒体信号处理复习笔记
  3. 淘宝关键词搜索、API开发、如何调用评论、商品详情、订单详情、
  4. Armv8-A虚拟化手册(2)
  5. Java 字符的 编码 与 乱码 和恢复
  6. 20小时速通AWS Certified Cloud Practitioner (CLF-C01) 证书经验分享
  7. Unity程序窗口最大化、最小化
  8. python listbox大小_python 3.5 tkinter.listbox更改大小
  9. libev 源码解析
  10. 颜色十六进制代码表 | HTML Color Codes Table