【Python练习】生成五月天歌名词云图和歌词词频词云图

该文详细介绍了如何使用Python编程语言爬取网易云音乐上五月天的所有歌词,清洗数据,进行分词词频统计,并制作词云图的过程。主要涉及网络请求、HTML解析、JSON处理、正则表达式、数据清洗、jieba分词库和WordCloud库的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、歌词爬取

二、清洗歌词数据

三、歌词分词 词频统计

四、词云图制作

五、从清洗数据到词云图的代码全文


一、歌词爬取

首先把五月天在网易云上的所有歌词下载下来,此处代码是站在大佬的肩膀上,参考爬取网易云音乐某个歌手的全部歌曲的歌词

自己做了一点小修改,五月天的id是13193,爬取歌词代码如下:

import requests
from lxml import etree
import simplejson
import re
import operator
from functools import reduce

ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
headers = {
    'User-agent': ua
}


class CrawlerLyric:
    def __init__(self):
        self.author_name = ""

    def get_url_html(self, url):
        with requests.Session() as session:
            response = session.get(url, headers=headers)
            text = response.text
            html = etree.HTML(text)
        return html

    def get_url_json(self, url):

        with requests.Session() as session:
            response = session.get(url, headers=headers)
            text = response.text
            text_json = simplejson.loads(text)
        return text_json

    def parse_song_id(self, html):

        song_ids = html.xpath("//ul[@class='f-hide']//a/@href")
        song_names = html.xpath("//ul[@class='f-hide']//a/text()")
        self.author_name = html.xpath('//title/text()')
        song_ids = [ids[9:len(ids)] for ids in song_ids]
        return self.author_name, song_ids, song_names

    def parse_lyric(self, text_json):
        try:
            lyric = text_json.get('lrc').get('lyric')
            regex = re.compile(r'\[.*\]')
            final_lyric = re.sub(regex, '', lyric).strip()
            return final_lyric
        except AttributeError as k:
            print(k)
            pass

    def get_album(self, html):
        album_ids = html.xpath("//ul[@id='m-song-module']/li/p/a/@href")
        album_names = html.xpath("//ul[@id='m-song-module']/li/p/a/text()")
        album_ids = [ids.split('=')[-1] for ids in album_ids]
        return album_ids, album_names

    def get_top50(self, sing_id):
        url_singer = 'https://music.163.com/artist?id=' + str(sing_id)  # 陈奕迅
        html_50 = self.get_url_html(url_singer)
        author_name, song_ids, song_names = self.parse_song_id(html_50)
        # print(author_name, song_ids, song_names)
        for song_id, song_name in zip(song_ids, song_names):
            url_song = 'http://music.163.com/api/song/lyric?' + 'id=' + str(song_id) + '&lv=1&kv=1&tv=-1'
            json_text = self.get_url_json(url_song)
            print(song_name)
            print(self.parse_lyric(json_text))
            print('-' * 30)

    def get_all_song_id(self, album_ids):

        with requests.Session() as session:
            all_song_ids, all_song_names = [], []
            for album_id in album_ids:
                one_album_url = "https://music.163.com/album?id=" + str(album_id)
                response = session.get(one_album_url, headers=headers)
                text = response.text
                html = etree.HTML(text)
                album_song_ids = html.xpath("//ul[@class='f-hide']/li/a/@href")
                album_song_names = html.xpath("//ul[@class='f-hide']/li/a/text()")
                album_song_ids = [ids.split('=')[-1] for ids in album_song_ids]

                all_song_ids.append(album_song_ids)
                all_song_names.append(album_song_names)

        return all_song_ids, all_song_names

    def get_all_song_lyric(self, singer_id):
        album_url = "https://music.163.com/artist/album?id=" + str(singer_id) + "&limit=150&offset=0"
        html_album = self.get_url_html(album_url)
        album_ids, album_names = self.get_album(html_album)
        all_song_ids, all_song_names = self.get_all_song_id(album_ids)
        all_song_ids = reduce(operator.add, all_song_ids)
        all_song_names = reduce(operator.add, all_song_names)
        print(all_song_ids)
        print(all_song_names)

        for song_id, song_name in zip(all_song_ids, all_song_names):
            url_song = 'http://music.163.com/api/song/lyric?' + 'id='
### Python 中 `for in` 的语法及使用 #### 基本概念 Python 提供了一种简洁而强大的方式来实现循环操作——即通过 `for in` 结构。该结构主要用于遍历可迭代对象中的每一个元素,例如列表、字符串、元组以及字典等[^3]。 #### 通用语法 以下是 `for in` 循环的一般形式: ```python for variable in iterable: # 执行代码块 ``` 其中,`variable` 是用来存储当前迭代值的一个变量名;`iterable` 表示支持迭代的对象(如列表、字符串或其他容器)。每一轮循环会依次取出 `iterable` 对象中的下一个元素并赋给 `variable`,直到完成整个序列的遍历为止[^4]。 #### 使用实例 ##### 遍历列表 下面的例子展示了如何利用 `for in` 来访问列表里的每一项内容。 ```python l = ['鹅鹅鹅', '曲项向天歌', '锄禾日当午', '春种一粒粟'] for i in l: print(i) ``` 上述脚本将会逐条打印出诗句的内容。 如果还需要知道每个项目的索引位置,则可以借助内置函数 `enumerate()` 实现这一点。 ```python for index, value in enumerate(l): print(f"{index}: {value}") ``` ##### 处理字符串 除了作用于列表之外,`for in` 同样适用于处理单个字符组成的字符串情况。 ```python s = "hello" for char in s: print(char.upper()) ``` 这段程序将把输入串中的字母逐一转换成大写形式后输出[^1]。 ##### 字典键值对提取 当我们面对的是字典型的数据集合时,可以通过特定方法分别获取其所有的key或者对应的value部分。 ```python d = {'a': 10, 'b': 20} # 获取keys for key in d.keys(): print(key) # 或者直接这样也可以获得同样的效果 for key in d: print(key) # 如果想同时拿到keyvalue的话则需调用items()方法 for k,v in d.items(): print(k,'->',v ) ``` #### 注意事项 尽管 `for in` 很方便易懂,在实际编码过程中仍可能出现某些典型的陷阱导致报错现象发生。比如忘记添加必要的冒号(:),这属于最常见的初学者失误之一[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值