赞
踩
今天我们做一个数据可视化的项目,爬取毛不易的歌词做词云展示。
1.爬取数据
我们主要使用 Python 爬虫获取 HTML,用 XPath 对歌曲的 ID、名称进行解析,然后通过网易云音乐的 API 接口获取每首歌的歌词,最后将所有的歌词合并得到一个变量。`
需要获取符合这个 XPath 的内容。我们通过分析 HTML 代码,能看到一个关键的部分:id=‘hotsong-list’。这个代表热门歌曲列表,也正是我们想要解析的内容。我们想要获取这个热门歌曲列表下面所有的链接,XPath 解析就可以写成 //*[@id=‘hotsong-list’]//a。然后你能看到歌曲链接是 href 属性,歌曲名称是这个链接的文本。
headers = { 'Referer' :'http://music.163.com', 'Host' :'music.163.com', 'Accept' :'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'User-Agent':'Chrome/10' } # 得到指定歌手页面 热门前50的歌曲ID,歌曲名 def get_songs(artist_id): page_url = 'https://music.163.com/artist?id=' + artist_id # 获取网页HTML res = requests.request('GET', page_url, headers=headers) # 用XPath解析 前50首热门歌曲 html = etree.HTML(res.text) href_xpath = "//*[@id='hotsong-list']//a/@href" name_xpath = "//*[@id='hotsong-list']//a/text()" hrefs = html.xpath(href_xpath) names = html.xpath(name_xpath) # 设置热门歌曲的ID,歌曲名称 song_ids = [] song_names = [] for href, name in zip(hrefs, names): song_ids.append(href[9:]) song_names.append(name) print(href, ' ', name) return song_ids, song_names # 设置歌手ID,毛不易为12138269 artist_id = '12138269' [song_ids, song_names] = get_songs(artist_id)
获得歌曲 ID 之后,我们还需要知道这个歌曲的歌词,对应代码中的 get_song_lyric 函数,在这个函数里调用了网易云的歌词 API 接口`
# 得到某一首歌的歌词
def get_song_lyric(headers,lyric_url):
res = requests.request('GET', lyric_url, headers=headers)
if 'lrc' in res.json():
lyric = res.json()['lrc']['lyric']
new_lyric = re.sub(r'[\d:.[\]]','',lyric)
return new_lyric
else:
return ''
print(res.json())
2.设置停用词
有一些常用词,比如’作词’, ‘作曲’, '编曲’等,我们可以把这些词设置为停用词,编写 remove_stop_words 函数,从文本中去掉:
# 去掉停用词
def remove_stop_words(f):
stop_words = ['作词', '作曲', '编曲', 'Arranger', '录音', '混音', '人声', 'Vocal', '弦乐', 'Keyboard', '键盘', '编辑', '助理', 'Assistants', 'Mixing', 'Editing', 'Recording', '音乐', '制作', 'Producer', '发行', 'produced', 'and', 'distributed']
for stop_word in stop_words:
f = f.replace(stop_word, '')
return f
3.最后编写 create_word_cloud 函数,通过歌词文本生成词云文件。
创建好 WordCloud 类之后,就可以使用 wordcloud=generate(text) 方法生成词云,传入的参数 text 代表你要分析的文本,最后使用 wordcloud.tofile(“a.jpg”) 函数,将得到的词云图像直接保存为图片格式文件。或者使用 Python 的可视化工具 Matplotlib 进行显示。
# 生成词云 def create_word_cloud(f): print('根据词频,开始生成词云!') f = remove_stop_words(f) cut_text = " ".join(jieba.cut(f,cut_all=False, HMM=True)) wc = WordCloud( font_path="./wc.ttf", max_words=100, width=2000, height=1200, ) print(cut_text) wordcloud = wc.generate(cut_text) # 写词云图片 wordcloud.to_file("wordcloud.jpg") # 显示词云文件 plt.imshow(wordcloud) plt.axis("off") plt.show()
4.结果展示
5.总结
前期的数据准备在整个过程中占了很大一部分。使用 Python 作为数据采集工具,利用Python 爬虫和 XPath 解析。词云工具 WordCloud,它是一个很好用的 Python 工具,可以将复杂的文本通过词云图的方式呈现。需要注意的是,当我们需要使用中文字体的时候,比如黑体 SimHei,就可以将 WordCloud 中的 font_path 属性设置为 SimHei.ttf,你也可以设置其他艺术字体,在给毛不易的歌词做词云展示的时候,我们就用到了艺术字体。
完整代码放在了GitHub上,地址为https://github.com/Kenneth-He/Python/tree/master/Maomao
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。