今天我們做乙個資料視覺化的專案,爬取毛不易的歌詞做詞云展示。
1.爬取資料
我們主要使用 python 爬蟲獲取 html,用 xpath 對歌曲的 id、名稱進行解析,然後通過網易雲**的 api 介面獲取每首歌的歌詞,最後將所有的歌詞合併得到乙個變數。`
需要獲取符合這個 xpath 的內容。我們通過分析 html **,能看到乙個關鍵的部分:id=『hotsong-list』。這個代表熱門歌曲列表,也正是我們想要解析的內容。我們想要獲取這個熱門歌曲列表下面所有的鏈結,xpath 解析就可以寫成 //*[@id=『hotsong-list』]//a。然後你能看到歌曲鏈結是 href 屬性,歌曲名稱是這個鏈結的文字。
headers =
# 得到指定歌手頁面 熱門前50的歌曲id,歌曲名
defget_songs
(artist_id)
: page_url =
''+ 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):9
:])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 介面`
# 得到某一首歌的歌詞
defget_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 函式,從文字中去掉:
# 去掉停用詞
defremove_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 進行顯示。
# 生成詞云
defcreate_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)
# 寫詞云
)# 顯示詞云檔案
plt.imshow(wordcloud)
plt.axis(
"off"
) plt.show(
)
4.結果展示
5.總結
前期的資料準備在整個過程中佔了很大一部分。使用 python 作為資料採集工具,利用python 爬蟲和 xpath 解析。詞云工具 wordcloud,它是乙個很好用的 python 工具,可以將複雜的文字通過詞雲圖的方式呈現。需要注意的是,當我們需要使用中文字型的時候,比如黑體 simhei,就可以將 wordcloud 中的 font_path 屬性設定為 simhei.ttf,你也可以設定其他藝術字型,在給毛不易的歌詞做詞云展示的時候,我們就用到了藝術字型。
完整**放在了github上,位址為
python之詞云學習及詞云的實現
width 指定的寬度,預設400畫素 height 指定的高度,預設200畫素 min font size 指定詞雲中字型的最小字型大小 max font size 指定詞雲中字型的最大字型大小 font step 指定詞雲中字型字型大小的步進間隔 font path 指定字型檔案的路徑,例 微軟...
Python學習 string功能展示
字串拼接 a abc b 123 print a b abc123 c join a,b print c abc123 總結 join 相較於 可以避免記憶體空間的浪費,並且更加快速 字串內建功能 str hello word t str.count l 統計元素個數 w str.capitaliz...
python學習系列 1
今天是學習python的第一天 覺得有必要做點記錄,加上程式設計學習做紙質筆記個人覺得不太合適,於是將這裡當成記錄學習程式設計的本吧。1.程式編寫的基本方法 ipo input process output 2.解決程式設計問題的步驟 分析問題 分析問題的計算部分,理清思路 劃分邊界 劃分問題的功能...