python爬取歌词并生成词云图

第一部分:爬取数据

# 第一部分:爬取数据
import requests
import re
import os
import json
from bs4 import BeautifulSoup

#发起响应
def get_html(url):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'}
    try:
        response = requests.get(url, headers=headers)
        html = response.content
        return html
    except:
        print('request error')
        pass

#函数:按照歌曲id,提取歌词内容
def download_by_music_id(music_id):
    lrc_url = 'http://music.163.com/api/song/lyric?'+'id='+str(music_id) + '&lv=1&kv=1&tv=-1'
    r = requests.get(lrc_url)
    json_obj = r.text
    j = json.loads(json_obj)
    try:
        lrc = j['lrc']['lyric']
        pat = re.compile(r'\[.*\]')
        lrc = re.sub(pat, "",lrc)
        lrc = lrc.strip()
        return lrc
    except:
        pass

#函数:按照歌手id,发起请求,解析网页,提取歌曲id
def get_music_ids_by_musician_id(singer_id):
    singer_url = 'http://music.163.com/artist?id={}'.format(singer_id)
    r = get_html(singer_url)
    soupObj = BeautifulSoup(r,'lxml')
    song_ids = soupObj.find('textarea').text
    jobj = json.loads(song_ids)
    ids = {}
    for item in jobj:
        print(item['id'])
        ids[item['name']] = item['id']
    return ids

# 创建文件夹,在文件夹下存储每首歌的歌词
# os.mkdir创建目录,os.chdir改变当前工作目录到指定的路径
def download_lyric(uid):
    try:
        os.mkdir(str(uid))
    except:
        pass

    os.chdir(str(uid))
    music_ids = get_music_ids_by_musician_id(uid)
    for key in music_ids:
        text = download_by_music_id(music_ids[key])
        file = open(key+'.txt', 'a')
        file.write(key+'\n')
        file.write(str(text))
        file.close()

if __name__ == '__main__':
    download_lyric(6731)

第二部分:词频分析

利用jieba分词包进行分词,用set()去掉每首歌里的重复的词(比如在一首歌里出现北京北京北京北京只按1次算),同时去掉停用词(如的、和、吗等无意义的虚词),统计词频,然后以词云图显示。

# 第二部分:词频分析

import os
from collections import Counter
import  jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from scipy.misc import imread
from pylab import mpl

#第一步:定义停用词库
def stopwordslist(filepath):
    stopwords = [line.strip() for line in open(filepath, 'r').readlines()]
    return stopwords
stopwords=stopwordslist('C:/Users/chen/PycharmProjects/stoplist.txt')

# 第二步:读取文件,分词,生成all_words列表,用停用词检查后生成新的all_words_new
all_words=[]
outstr = ''
for filename in os.listdir('6731'):
    with open('6731/'+filename) as f:
        lyrics=f.read()
        data=jieba.cut(lyrics)
        all_words.extend(set(data))
for word in all_words:
    if word not in stopwords:
        if word != '\t':
            outstr += word
            outstr += " "
all_words_new= outstr.split(" ") #转成列表
#第三步:对all_words中的词计数,并按照词频排序
count=Counter(all_words_new)
result=sorted(count.items(), key=lambda x: x[1], reverse=True)
print(result)
#第四步,词云显示
#将频率变成字典
word_dic=dict(count.items())
# 使matplotlib模块能显示中文
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
color_mask=imread('xinxing.jpg') #背景图
cloud=WordCloud(
    font_path='C:\Windows\Fonts\SIMYOU.TTF',
    width=600,
    height=480,
    background_color='black',
    mask=color_mask,
    max_words=350,
    max_font_size=150)
world_cloud=cloud.fit_words(word_dic)
world_cloud.to_file('zhaolei.jpg')

第三部分:成果


所以赵雷:一个阳光大孩子,唱着生活理想,在寂寞的晚上画扇月亮,用希望填补虚妄;但青春就像一辆籍籍无名的列车,离开了故乡,记忆里是晴朗天空下,母亲于老槐树下缝补衣裳

 

常用词——“衣裳”:

窑上路:让我添上件衣裳和你去村庄

南方姑娘:阳光里她在院子中央晾晒着衣裳

吉姆餐厅:快烧掉陈旧的忧伤,穿上那件未见过太阳的新衣裳

OVER: 穿着你送的衣裳,曾记起你笑的模样

朵:若她只是件衣裳,那我就没有必要隐藏欲望

 

常用词——“月亮

画:为寂寞的夜空画上一个月亮 把我画在那月亮下面歌唱

背影:月亮入睡 在有星星下的路口

赵小雷:抬头是太阳白云月亮和星星低头是皮鞋仔裤不屑的个性和命运

鼓楼:睡不着的后海边 月亮还在抽着烟

月亮粑粑:我就住在月亮笑容下面的小街道我的邻居清早起床总是会大喊大叫

 

常用词——“生活”、“理想”、“孩子

不开的唇:生活简单的就像是一块石子 我只不过是一个唱歌的孩子

八十年代的歌:时间请你快一点的过 别让我一个人守日落 我想过平常人的生活

南方姑娘:日子过的就像那些不眠的晚上 她嚼着口香糖对墙漫谈着理想

理想:理想今年你几岁

已是两条路上的人:你会在回家的路上擦干眼泪 不在你的母亲面前哭泣

朵:我多么想你能摆脱这世间给予的浮夸 就像我母亲年轻时那样的无华

 

最后,没有去掉“走”这个字是因为赵雷确实也很喜欢用这个动词来表达离开/告别:

孤独:你只是为我盖一盖被子就了 可那只是一场梦

已是两条路上的人:告别的话再不用说了 你尽管的干脆一些

无法长大:时光拿 了你的美丽岁月带 了我的脾气 对不起 我还欠你一场婚礼
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值