齐一都在唱什么呢+歌词词云分析

9月前 71

python版本 3.6.2

如果你是民谣控,应该听过齐叔的歌吧!那首经典的[这个年纪]但我的女人呢~但我的女人呢~ 当初听到这首歌的时候就深深的爱上,可谓真是有毒呀!
作为齐叔的歌迷,必须要分析一下齐叔呀!那么齐叔都在唱些什么呢?想办法获取所有齐叔的歌的歌词,发现酷我音乐刚好有齐叔所有音乐还包括歌词。
这下有了目标,接下来就是先拿数据啦!

引用库文件

# -*-coding:utf-8-*-
import requests
import re
from requests import RequestException
from bs4 import BeautifulSoup
import codecs
from os import path
import numpy as np
from PIL import Image
import jieba
from wordcloud import WordCloud

获取整个网页内容

def get_page(url):
    Headers = {
    'Host':'www.kuwo.cn',
    'User - Agent':'Mozilla / 5.0(WindowsNT10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 60.0.3112.101Safari / 537.36'
    }
    try:
        response = requests.get(url,headers=Headers)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        print('请求失败!')
        return None

解析页面提取所有歌曲的链接

def parse_page(html):
    soup = BeautifulSoup(html,'lxml')
    list = soup.find('div',attrs={'class':'geci'})
    lsoup = BeautifulSoup(str(list),'lxml')
    count = -1
    music_url = []
    for x in lsoup.find_all('a'):
        count = count+1
        if count%2==0:
            music_url.append(x)
    #输出music_url
    #正则表达式提取歌曲链接和歌名
    regex = '<a href="(.*?)".*?>(.*?)</a>'
    pattern = re.compile(regex, re.S)
    items = re.findall(pattern, str(music_url))  # 先传入规则,在传需要在匹配源
    url = []
    for item in items:
        url.append(item[0])
        # print(item[0],item[1])
    #返回歌曲链接结果
    return url

获取每个链接对于的歌曲歌词

def get_lrc(url):
    response = requests.get(url=url)  # http://www.kuwo.cn/geci/a_285345/
    bs = BeautifulSoup(response.text, 'lxml')
    # 使用select方法获得的节点可能不止一个,所以返回的类型是个list
    # 异常处理 http://www.kuwo.cn/geci/l_14392025 《这个年纪 - 伴奏》歌词 — 齐一 没有歌词会报错,
    try:
        lyric = bs.select('div#lrc_yes')[0]
        if lyric!=None:
            for item in lyric.strings:
                # print(item)
                #获取每一句歌词并写入文件
                write_file(item)
    except Exception:
        print('当前歌曲没有歌词,歌曲链接为',url)

写入文件

def write_file(content):
    with open('齐一.txt','a') as f:
        f.write(content)
        f.flush()
        f.close()

制作词云

def draw_wordcloud():
    with codecs.open('齐一.txt',encoding='utf-8') as f:
        comment_text = f.read()
    cut_text = " ".join(jieba.cut(comment_text)) # 将jieba分词得到的关键词用空格连接成为字符串
    d = path.dirname(__file__) # 当前文件文件夹所在目录
    color_mask = np.array(Image.open(path.join(d, "齐一.png"))) # 读取背景图片
    cloud = WordCloud(font_path=path.join(d,'simsun.ttc'), # 字体文件 这个字体window自带有 可以自行更换
                      background_color='white',    # 设置背景颜色
                      mask=color_mask,             # 设置背景图片
                      max_words=2000,              # 设置最大显示的字数
                      random_state=50,             # 设置有多少种随机生成状态,即有多少种配色方案
                      max_font_size=100)           # 设置字体最大值
    word_cloud = cloud.generate(cut_text) # 产生词云
    word_cloud.to_file("pjl_cloud.jpg")  #生成的文件

执行方法操作

if __name__ == '__main__':
    #歌单列表网址
    url = 'http://www.kuwo.cn/geci/a_285345/'
    #获取所有歌曲网址内容
    html = get_page(url)
    #解析网页,提取所有歌曲链接
    music_url = parse_page(html)
    #循环爬取
    for url in music_url:
        print('正在爬取',url)
        #获取歌词
        lrc = get_lrc(url)
    #生成词云
    draw_wordcloud()

效果图
这里写图片描述

歌词文件及背景图片下载链接:http://pan.baidu.com/s/1mhRSI96 密码:o7ky

path 正则表达式 url open html list

作者

二进制循环
TA的文章

相关文章