今天咋們來看看網易雲趙雷的歌曲歌詞,並做一個詞雲圖。這篇文章可以學習到什么是詞雲,爬蟲的基本流程,簡單的可視化操作
@
一 什么是詞雲
可視化有很多種,好的數據可視化,可以使得數據分析的結果更加通俗易通。"詞雲"屬於可視化的一種,它會根據關鍵詞的出現頻率生成一幅圖,這樣可以讓我們一眼就知道其主要要點。比如下面
二 制作詞雲的步驟
1 第一步收集需要可視化的內容。
內容可以是文章內容,當然也可以是爬蟲的內容。這里我們先使用NAB球星科比的材料作為內容。
2 安裝詞雲庫
wordcloud,安裝方法如下(前提是電腦已經有了python環境和一些基礎庫喲,建議可以裝個Anaconda,這樣就少了很多依賴包的麻煩喲)
- pip install wordcloud
- pip install jieba--------中文庫,因為我想展示中文內容
- pip install PIL----------圖像處理庫
- pip install matplotlib-----圖像展示庫
3 介紹下jieba中文庫和下面會用到的wordcloud常用參數
(1) jieba簡介
- jieba中文庫
它是python中文分詞組件,具有三種分詞模式- 精確模式,試圖將句子最精確的切開,比較適合文本分析
- 全模式,把句子中所有可以成詞的都掃描出來,速度很快,但是不能解決歧義
- 搜索引擎模式,在精確模式的基礎上對長詞進行再次切分,適合用於搜索引擎分詞
- 支持繁體分詞
- 支持自定義詞典
- MIT授權協議
(2) jieba API
jieba.cut 接受三個參數
需要分詞的字符串,可以是中文
- cut_all bollean類型的參數,用來控制是否采用全模式
- HMM參數用來控制是否采用HMM模型(隱馬模型--后續進行相關學習)
jieba.cut_for_search 接受兩個參數
需要分詞的字符串,可以為中文
HMM參數用來控制是否采用HMM模型
它與jieba.cut 的最大區別就在於分詞更加細膩,且會將全部的可能性輸出,因此沒有cut_all 參數
4 科比詞雲圖制作測試代碼1
#-*- coding:utf-8 -*
f='科比的職業生涯隨湖人隊5奪NBA總冠軍(2000年-2002年、2009年-2010年);\
榮膺1次常規賽MVP(2007-08賽季),2次總決賽MVP(2009年-2010年),\
4次全明星賽MVP(2002年、2007年、2009年與2011年),\
與鮑勃·佩蒂特並列NBA歷史第一;共18次入選NBA全明星陣容,15次入選NBA最佳陣容,12次入選NBA最佳防守陣容'
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import jieba
from PIL import Image as image
import numpy as np
#生成詞雲
def create_word_cloud(f):
print('根據詞頻計算詞雲')
text = " ".join(jieba.cut(f,cut_all=False, HMM=True))
wc = WordCloud(
font_path="./SimHei.ttf",#設置字體 針對中文的情況需要設置中文字體,否則會亂碼
max_words=100,# 設置最大的字數
width=2000,#設置畫布的寬度
height=1200,#設置畫布的高度
)
wordcloud=wc.generate(text)
#寫詞雲圖片
wordcloud.to_file("wordcloud.jpg")
#顯示詞雲文件
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
create_word_cloud(f)
```python
結果顯示:
三 案例 網易雲歌手房東的貓詞雲圖
1 整體流程圖
2 爬取+詞雲制作
(1) 我們先查看網易雲的歌詞API接口需要什么常用接口。發現需要一個ID。所以第一步訪問url進入歌手界面,尋找規律得出歌手ID。
-
進入歌手頁面 歌手頁面
-
點擊趙雷歌曲頁面 趙雷歌曲頁面。這里可以多點擊幾個歌手,就會發現不同的歌手頁面不同的地方在URL后面的ID不同,
-
點擊歌手名字,進入歌手頁面,選中熱門50首中div的id屬性
-
因為我們需要每首歌的歌詞,所以需要尋找歌曲的歌詞連接,通常為a標簽,所以我們往下看,用xpath解析出所有的a標簽
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
(2) 現在拼接我們的爬取歌詞的url。http://music.163.com/api/song/lyric?os=pc&id=' + song_id + '&lv=-1&kv=-1&tv=-1'
# 獲取每首歌歌詞
for (song_id, song_name) in zip(song_ids, song_names):
# 歌詞API URL
lyric_url = 'http://music.163.com/api/song/lyric?os=pc&id=' + song_id + '&lv=-1&kv=-1&tv=-1'
lyric = get_song_lyric(headers, lyric_url)
all_word = all_word + ' ' + lyric
print(song_name)
(3) 去掉部分停用詞比如作詞,編曲等詞語
# 去掉停用詞
def remove_stop_words(f):
stop_words = ['作詞', '作曲', '編曲', '人聲', 'Vocal', '弦樂', 'Keyboard', '鍵盤', '編輯', '助理', 'Assistants', 'Mixing', 'Editing', 'Recording', '音樂', '制作', 'Producer', '發行', 'produced', 'and', 'distributed']
for stop_word in stop_words:
f = f.replace(stop_word, '')
return f
(4)整體代碼
import requests
import re
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import jieba
import PIL.Image as image
from lxml import etree
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'
}
# 得到某一首歌的歌詞
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())
# 去掉停用詞
def remove_stop_words(f):
stop_words = ['作詞', '作曲', '編曲', '人聲', 'Vocal', '弦樂', 'Keyboard', '鍵盤', '編輯', '助理', 'Assistants', 'Mixing', 'Editing', 'Recording', '音樂', '制作', 'Producer', '發行', 'produced', 'and', 'distributed']
for stop_word in stop_words:
f = f.replace(stop_word, '')
return f
# 生成詞雲
def create_word_cloud(f):
print('根據詞頻,開始生成詞雲!')
f = remove_stop_words(f)
cut_text = " ".join(jieba.cut(f,cut_all=False, HMM=True))
import numpy as np
mask=np.array(image.open(r"C:\Users\lj\Desktop\1.jpg"))
wc = WordCloud(
mask=mask,
font_path="./SimHei.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()
# 得到指定歌手頁面 熱門前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,趙雷為6731
artist_id = '6731'
[song_ids, song_names] = get_songs(artist_id)
# 所有歌詞
all_word = ''
# 獲取每首歌歌詞
for (song_id, song_name) in zip(song_ids, song_names):
# 歌詞API URL
lyric_url = 'http://music.163.com/api/song/lyric?os=pc&id=' + song_id + '&lv=-1&kv=-1&tv=-1'
lyric = get_song_lyric(headers, lyric_url)
all_word = all_word + ' ' + lyric
print(song_name)
#根據詞頻 生成詞雲
if __name__ == '__main__':
create_word_cloud(all_word)
結果
4 總結
今天總結下整體的內容。其中涉及到的知識點有可視化,詞雲圖制作以及中文的jieba庫。
不知道你們看完有一點點收獲嗎?如果有收獲希望你
- 點贊 給予我更多鼓勵同時讓更多人學習
- 關注我公眾號[我是程序員小賤]獲取更多的干貨。相信我不會讓你們失望!