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

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

import requests
import json
import re
from bs4 import BeautifulSoup

def 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.text

    j = json.loads(json_obj)
    lrc = j['lrc']['lyric']
    pat = re.compile(r'\[.*\]')  #这里几行代码是把歌词中的空格和符号之类的去掉
    lrc = re.sub(pat,"",lrc)  
    lrc = lrc.strip()
    return lrc

def 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).text
    soupObj = BeautifulSoup(r,'lxml')
    song_ids = soupObj.find('textarea').text
    jobj = 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 os

def 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.text

    j = json.loads(json_obj)
    lrc = j['lrc']['lyric']
    pat = re.compile(r'\[.*\]')
    lrc = re.sub(pat,"",lrc)
    lrc = lrc.strip()
    return lrc

def 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).text
    soupObj = BeautifulSoup(r,'lxml')
    song_ids = soupObj.find('textarea').text
    jobj = 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中经常会用到的语句,有兴趣的不妨多了解一下,在后面的学习中我们也会提到的。大家国庆快乐!!

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值