Python爬蟲網易雲歌詞及詞頻統計

採用詞雲對鄧紫棋的熱門前50歌曲進行可視化展示。

本次可視化步驟需要掌握的內容有:

  1. 瞭解爬蟲的原理
  2. 掌握xpath的用法
  3. 掌握詞雲工具wordcloud的使用
  4. 瞭解分詞根據jieba的使用
  5. 正則表達式的複習

首先,需要找到網易雲音樂的音樂人的網頁鏈接,再根據熱門歌曲獲取每一首熱門歌曲的歌詞。

獲取每首歌的歌曲ID,歌曲名稱
獲取每首歌的歌詞,彙總成一個歌詞文本
創建詞雲模型,進行展示。
本文可參考:https://blog.csdn.net/weixin_...

下面是一些進行項目時候的一些小錯誤,直接用pycharm的debug功能仔細查看哪一個步驟出錯了,需要細心去寫代碼,爬蟲很容易出現一些非語法方面的錯誤。
非語法錯誤

獲取指定歌手頁面的xpath的時候,少打了一個@ ,導致沒有獲取到相應歌曲的網頁鏈接的ID。
圖片描述

獲取網易雲音樂歌詞的時候,打錯了關鍵字,將歌詞 'lrc'錯打成了 'lyc',導致沒有歌詞輸出,同時正則表達式少打了一個 ]

# -*- coding:utf-8 -*-
# 網易雲音樂 通過歌手ID,生成該歌手的詞雲
import requests
import os
import re
import sys
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
import jieba
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()['lyc']['lyric'] # 根據頁面獲取歌詞文件
        lyric = res.json()['lrc']['lyric']  # 根據頁面獲取歌詞文件
        # new_lyric = re.sub(r'[\d:.[\]','',lyric) # 對歌詞裏面的時間等進行正則表達式替換
        new_lyric = re.sub(r'[\d:.[\]]','', lyric)  # 對歌詞裏面的時間等進行正則表達式替換
        return new_lyric
    else:
        return ''
        # print(res.json())


# 去掉停用詞
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


# 得到指定歌手頁面 熱門前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()"
    # 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


# 生成詞雲
def creat_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("artist_wordcloud.jpg")
    # 展示詞雲文件
    plt.imshow(wordcloud)
    plt.axis("off")
    plt.show()


# 設置歌手 ID,鄧紫棋爲 7763
artist_id = '7763'
[song_ids,song_names] = get_songs(artist_id)
# 所有歌詞
all_words = ''
# 獲取每首歌歌詞
for (song_id,song_name) in zip(song_ids,song_names):
    # 歌詞api url
    lybric_url = 'http://music.163.com/api/song/lyric?os=pc&id=' + song_id + '&lv=-1&kv=-1&tv=-1'
    lyric = get_song_lyric(headers,lybric_url)
    all_words = all_words + " " + lyric
    print(song_name)


# 根據詞頻生成詞雲
creat_word_cloud(all_words)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章