Python爬虫歌词及词频统计--(谢春花)

我从崖边跌落 落入星空辽阔 银河不清不浊 不知何以摆脱——谢春花《我从崖边跌落》

作为一名春花粉,决定用python,分析下春花歌词里的高频词语,以期找到有趣的规律。

1. 数据爬取

歌词来源:网易云谢春花热门26首

爬取完之后以txt格式存储

# 第一部分:爬取数据
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(1039895)

2.     歌词分析

利用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('1039895'):
    with open('1039895/'+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('chunhua.jpg')
plt.imshow(world_cloud)

Python爬虫歌词及词频统计--(谢春花)_第1张图片

谢春花式少女情怀,在每个洒满阳光的日子,藏一桩期盼,几许思,做一颗在春天开花的树,有生之年,做几场,忍几次,但一定会遇见你,然后把明天说与你听,不知你愿不愿

常用词——“”:

11887:宠溺的笑 漏半拍

借我:借我怦然动如往昔

只道寻常:雨落时才想起那种

11887: 我想此刻的被你填满了一些

心空空:时而空空时而痛汹涌

 

常用词——“

唱不了一首欢乐的歌:嘿 我想只有你我了

妄为:稠密的心思没几人能懂 到头来怕只把自己感动

心空空说来不知你会不会

荒岛:我想让你我的固执

 

常用词——“遇见”、“相见”、“

一棵会开花的树:但有生之年还好遇见

如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁:这样慵懒的午后 转角书店遇见

我一定会爱上你:虽然我还没遇见你但我一定会爱上你

洛干的吻:期待每一次的相见

已是两条路上的人:不用停留 就要相见

只道寻常相距远相见难不聚只散

俗人言:今生莫相见

我从崖边跌落:谁把美捕捉

新屋:把时间交给 温热的床 一同跌进

无终:胜握在掌 神魂摇荡 故事几章一场

“如此幸福的一天。雾一早就散了,我在花园里干活。蜂鸟停在忍冬花上。这世上没有一样东西我想占有,我知道没有一个人值得我羡慕。任何我曾遭受的不幸,我都已忘记。想到故我今我同为一人并不使我难为情。在我身上没有痛苦。直起腰来,我望见蓝色的大海和帆影。” ——以米沃什的《礼物》结尾,have a sweet dream。

你可能感兴趣的:(python)