1. 程式人生 > >爬取網易雲聽歌排行榜歌單制作雲詞

爬取網易雲聽歌排行榜歌單制作雲詞

proc ges ase params 網頁 web api .post 想要

最近又到了一年一度的年底總結了,網易雲音樂如此退出了年度歌單,又一次被刷朋友圈了。作為程序員,就好奇的想驗證下結論準不準,隨便回顧下爬蟲的操作。
首先,打開網頁版網易雲音樂,登錄成功後,進入自己或好友的聽歌排行榜,如圖:
技術分享圖片
直接使用瀏覽器的開發工具,刷新頁面查看接口及其返回結果,找到刷新該列表的接口,如圖:
技術分享圖片
技術分享圖片
找到url後,再找到對應的cookie等值,復制保存。如圖:
技術分享圖片
技術分享圖片
至此,我們已經找到網頁所有想要的信息了,下面我們就可以直接用代碼實現了。
思路:
```
a.先爬取歌曲列表,獲取對應歌曲的信息,存放到數據庫,以便後面使用
b.通過歌曲的id,獲取對應的歌詞;
c.讀取歌詞分析獲取關鍵詞
d.選擇自定義的背景圖生成自己的詞圖

需要用到的模塊

import requests
import re
import pymssql
import matplotlib.pyplot as plt # 數學繪圖庫
from PIL import Image
import numpy as np # 科學數值計算包,可用來存儲和處理大型矩陣
import jieba # 分詞庫
from wordcloud import WordCloud, ImageColorGenerator # 詞雲庫
from selenium import webdriver
import time

自定義三個函數
a)get_info():獲取歷史列表中的所有歌曲並將其寫入數據庫中,同時返回所有歌曲的id,以便後面獲取歌詞
代碼塊如下:
def get_info(url,headers):
    ‘‘‘獲取歷史列表中的所有歌曲並將其寫入數據庫中,同時返回所有歌曲的id,
    以便後面獲取歌詞‘‘‘
    """
    @url:歷史列表中的URl
    @headers:請求頭,帶cookie
    """
    data = {
        ‘encSecKey‘: ‘post參數->瀏覽器Network獲取或抓包獲取‘,
        ‘params‘: ‘post參數->瀏覽器Network獲取或抓包獲取‘
    }
    html = requests.post(url,data=data,headers=headers)
    html.encoding=‘utf-8‘
    lmusic = html.json()[‘allData‘]
    listid = []
    try:
        connet = pymssql.connect(host=‘127.0.0.1‘,user=‘sa‘,password=‘123456‘,database=‘WebSpider‘)#數據庫參數
    except pymssql.OperationalError as p:#異常處理
        print(p)
    else:
        cursor = connet.cursor()
        for music in lmusic:
            playCount=music[‘playCount‘]
            mname=music[‘song‘][‘name‘]
            mid=music[‘song‘][‘id‘]
            listid.append(mid)
            musicer = music[‘song‘][‘ar‘][0][‘name‘]
            print("正在向數據庫插入%s的信息"%mname)
            if ‘\‘‘ in mname:
            #對帶有單引號的內容進行轉義,不然插入數據庫會報錯
            mname=mname.replace(‘\‘‘,‘\‘\‘‘)
            sql = "insert into Music_wyy_2019 values (‘%d‘,‘%s‘,‘%s‘,‘%d‘)" % (mid, mname, musicer, playCount)
        else:
            sql = "insert into Music_wyy_2019 values (‘%d‘,‘%s‘,‘%s‘,‘%d‘)" % (mid, mname, musicer, playCount)
        cursor.execute(sql)
    connet.commit()
finally:
    connet.close()
    print("數據庫已關閉")
return listid

b)get_lyric():獲取所有歌曲的歌詞
吐槽一句,之前直接用‘http://music.163.com/api/song/media?id={id}‘.format(id=id), 就可以通過這個api直接獲取對應id歌曲的歌詞,現在被封了,只能用UI來分別爬取了,效率極低(考慮用多線程處理)
c)get_wordcloud():生成對應的詞雲圖
3.定義好歌詞存放的位置、選擇詞圖的背景圖及最後生成詞圖的位置,依次調用上面三個函數即可。效果圖如下:
技術分享圖片
4.關註公眾號,回復’網易雲’三個字即可獲取完整代碼,還可獲取專屬個人最愛音樂詞圖定制全過程代碼
技術分享圖片

爬取網易雲聽歌排行榜歌單制作雲詞