ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

爬取网易云听歌排行榜歌单制作云词

2019-01-13 11:00:08  阅读:337  来源: 互联网

标签:id 获取 mname 歌曲 歌词 数据库 music


最近又到了一年一度的年底总结了,网易云音乐如此退出了年度歌单,又一次被刷朋友圈了。作为程序员,就好奇的想验证下结论准不准,随便回顾下爬虫的操作。
首先,打开网页版网易云音乐,登录成功后,进入自己或好友的听歌排行榜,如图:
爬取网易云听歌排行榜歌单制作云词
直接使用浏览器的开发工具,刷新页面查看接口及其返回结果,找到刷新该列表的接口,如图:
爬取网易云听歌排行榜歌单制作云词
爬取网易云听歌排行榜歌单制作云词
找到url后,再找到对应的cookie等值,复制保存。如图:
爬取网易云听歌排行榜歌单制作云词
爬取网易云听歌排行榜歌单制作云词
至此,我们已经找到网页所有想要的信息了,下面我们就可以直接用代码实现了。
思路:
```
a.先爬取歌曲列表,获取对应歌曲的信息,存放到数据库,以便后面使用
b.通过歌曲的id,获取对应的歌词;
c.读取歌词分析获取关键词
d.选择自定义的背景图生成自己的词图

需要用到的模块

import requests
import re
import pymssql
import matplotlib.pyplot as plt # 数学绘图库
from PIL import Image
import numpy as np # 科学数值计算包,可用来存储和处理大型矩阵
import jieba # 分词库
from wordcloud import WordCloud, ImageColorGenerator # 词云库
from selenium import webdriver
import time

自定义三个函数
a)get_info():获取历史列表中的所有歌曲并将其写入数据库中,同时返回所有歌曲的id,以便后面获取歌词
代码块如下:
def get_info(url,headers):
    '''获取历史列表中的所有歌曲并将其写入数据库中,同时返回所有歌曲的id,
    以便后面获取歌词'''
    """
    @url:历史列表中的URl
    @headers:请求头,带cookie
    """
    data = {
        'encSecKey': 'post参数->浏览器Network获取或抓包获取',
        'params': 'post参数->浏览器Network获取或抓包获取'
    }
    html = requests.post(url,data=data,headers=headers)
    html.encoding='utf-8'
    lmusic = html.json()['allData']
    listid = []
    try:
        connet = pymssql.connect(host='127.0.0.1',user='sa',password='123456',database='WebSpider')#数据库参数
    except pymssql.OperationalError as p:#异常处理
        print(p)
    else:
        cursor = connet.cursor()
        for music in lmusic:
            playCount=music['playCount']
            mname=music['song']['name']
            mid=music['song']['id']
            listid.append(mid)
            musicer = music['song']['ar'][0]['name']
            print("正在向数据库插入%s的信息"%mname)
            if '\'' in mname:
            #对带有单引号的内容进行转义,不然插入数据库会报错
            mname=mname.replace('\'','\'\'')
            sql = "insert into Music_wyy_2019 values ('%d','%s','%s','%d')" % (mid, mname, musicer, playCount)
        else:
            sql = "insert into Music_wyy_2019 values ('%d','%s','%s','%d')" % (mid, mname, musicer, playCount)
        cursor.execute(sql)
    connet.commit()
finally:
    connet.close()
    print("数据库已关闭")
return listid

b)get_lyric():获取所有歌曲的歌词
吐槽一句,之前直接用'http://music.163.com/api/song/media?id={id}'.format(id=id), 就可以通过这个api直接获取对应id歌曲的歌词,现在被封了,只能用UI来分别爬取了,效率极低(考虑用多线程处理)
c)get_wordcloud():生成对应的词云图
3.定义好歌词存放的位置、选择词图的背景图及最后生成词图的位置,依次调用上面三个函数即可。效果图如下:
爬取网易云听歌排行榜歌单制作云词
4.关注公众号,回复’网易云’三个字即可获取完整代码,还可获取专属个人最爱音乐词图定制全过程代码
爬取网易云听歌排行榜歌单制作云词

标签:id,获取,mname,歌曲,歌词,数据库,music
来源: http://blog.51cto.com/10836356/2342110

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有