根据Apple Music歌单一键生成词云

最近Apple Music可以查看自己的年度歌单了,兴趣使然下想写个脚本生成一个词云看下自己的听歌关键词,写完脚本后发现适配所有的Apple Music歌单(或者叫播放列表),下面是我自己的年度歌单词云:

d49c370da7100805

随便找了个轻音少女的播放列表,词云如下:

84516b0e0c100948

最后,代码如下:

import requests
from bs4 import BeautifulSoup
from wordcloud import WordCloud
import matplotlib.pyplot as plt


urls = ["https://music.apple.com/cn/playlist/%E8%BD%BB%E9%9F%B3%E5%B0%91%E5%A5%B3-%E4%BB%A3%E8%A1%A8%E4%BD%9C%E5%93%81/pl.ccbeece8304b43b394005148782a0e4b"]

word_list = []

HEADERS = {
    "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
    "accept-encoding": "gzip, deflate, br",
    "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
    "cache-control": "max-age=0",
    "upgrade-insecure-requests": "1",
    "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36 Edg/92.0.902.84",
}

font_path = "/System/Library/fonts/PingFang.ttc"

for url in urls:
    res = requests.get(url, headers=HEADERS)
    res.encoding = "utf-8"
    soup = BeautifulSoup(res.text, 'lxml')

    song_name_div = soup.select("div.songs-list-row__song-name.svelte-1yo4jst")
    song_singer_div = soup.select("div.songs-list__col.songs-list__col--secondary.svelte-1yo4jst > div > span > a")
    song_album_div = soup.select("div.songs-list__col.songs-list__col--tertiary.svelte-1yo4jst > div > span > a")

    for item in song_name_div:
        word_list.append(item.get_text())
    for item in song_singer_div:
        word_list.append(item.get_text())
    for item in song_album_div:
        word_list.append(item.get_text())

counts = {}
word_cloud = []
for word in word_list:
    counts[word] = counts.get(word, 0) + 1

items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True)

text_cut = '/'.join(word_list)
wordcloud = WordCloud(background_color='white',
                      font_path=font_path,
                      width=1000,
                      height=860,
                      margin=2,
                      collocations=False,).generate(text_cut)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 共3条

请登录后发表评论