送书|Python采集QQ音乐热歌榜首数据

今天给大家带来用python采集QQ音乐的热评~文末有送书哦~

我们可以看到这首歌曲的评论有10881条,不愧是榜首热歌,评论比较高。


一.初步测试

我们首先使用selenium测试一下环境:

from selenium import webdriver
import time

url = 'https://y.qq.com/n/ryqq/songDetail/0006wgUu1hHP0N'

driver = webdriver.Chrome()

driver.get(url)

time.sleep(1)

driver.maximize_window()

截图如下:

测试后发现没有问题。

注意:为了避免登录,使用谷歌模拟登录之前最好手动登录QQ音乐,浏览器记录了cookie信息,比较稳妥。


二.页面分析

通过分析页面可以知道评论数据是类似于瀑布流布局,页面数据会随着右侧滚动条的滚动被加载出来,换句话说,页面的url没有改变,我们要通过selenium控制滚轮操作页面,获取更多数据,然后我们看下评论数据在页面中对应的标签元素。

如下图所示:

我们可以看到一条评论就是一条li标签,那么由此可以确定数据采集思路:通过selenium控制滚轮滑到页面底部,然后经过短暂的时间(数据加载完全)后,实时监测页面的li标签数目(也就是评论数目),达到了目标数目之后进行数据解析和数据存储。


三.滚轮操作

通过循环的滚轮操作(控制滚轮到页面底部),来加载数据。

num = int(input('请输入目标评论数:')) # 控制采集评论数量(由自己掌控)

_single = True

while _single:
    # items:页面评论数据
    items = driver.find_elements_by_xpath("//li[@class='comment__list_item c_b_normal']")
    print(len(items))
    if len(items) < num: # 通过页面监测评论数量,与目标数量对比
        # 拖动滚动条至底部
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(2) # 等待2s,数据加载完全
    else:
        _single = False # 退出循环


四.解析页面

通过观察页面li标签下的内容:

我们的目标就是要爬取每个用户的头像链接,昵称,评论时间和评论内容。

info_list = []
for index,item in enumerate(items):
    dic = {}
    try: # 以防万一,try语句,便于爬虫进行
        headPortraits = item.find_element_by_xpath("./div[1]/a/img").get_attribute('src')  
        # 头像图片链接
        name = item.find_element_by_xpath("./div[1]/h4/a").text  # 昵称
        time = item.find_element_by_xpath("./div[1]/div[1]").text # 评论时间
        content = item.find_element_by_xpath("./div[1]/p/span").text # 评论内容
        content = content.replace('\n','') 
        # 因为考虑到有的用户评论较长,所以需要将换行符改成空格或者空字符,便于存储

        dic['headPor'] = headPortraits
        dic['name'] = name
        dic['time'] = time
        dic['cont'] = content
        print(index+1) 
        print(dic)
        info_list.append(dic)
        
    except Exception as e:
        print(e)

最后再运行的过程中,try语句还是有用的,因为数据没有爬取完全,有的数据有问题,如下所示:


五.数据存储

由于在上面我们把每一条评论数据以字典的形式保存在info_list的列表中,所以这里我们使用csv模块,把数据写入到csv文件中。

import csv

head = ['headPor','name','time','cont']
with open('bscxComment.csv', 'w', encoding='utf-8', newline='') as f:
    writer = csv.DictWriter(f, head)
    writer.writeheader()
    writer.writerows(info_list)
    print('写入成功')


六.运行程序

开始:

结束:

然后我们打开csv文件:

好的,大致就是这样的5000条评论数据。


七.词云展示

一.导入相关库
# 导入相应的库
import jieba
from PIL import Image
import numpy as np
import pandas as pd
from wordcloud import WordCloud
二.得到评论数据

注意:这里需要对评论那一列数据进行数据清洗,因为可能有的数据类型不是str,需要跳过,或者剔除

with open('data.txt',encoding='utf-8',mode='a') as f:
    for item in data['cont']:
        if type(item) != str:
            continue
        else:
            f.write(item,)
    print('写入成功!')
三.词云展示
# 导入文本数据并进行简单的文本处理
# 去掉换行符和空格
text = open("./data.txt",encoding='utf-8').read()

# 分词,返回结果为词的列表
text_cut = jieba.lcut(text)
# 将分好的词用某个符号分割开连成字符串
text_cut = ' '.join(text_cut)


word_list = jieba.cut(text)
space_word_list = ' '.join(word_list)
# print(space_word_list)
# 调用包PIL中的open方法,读取图片文件,通过numpy中的array方法生成数组
mask_pic = np.array(Image.open("./cat.png"))
word = WordCloud(
    font_path='C:/Windows/Fonts/simfang.ttf',  # 设置字体,本机的字体
    mask=mask_pic,  # 设置背景图片
    background_color='white',  # 设置背景颜色
    max_font_size=150,  # 设置字体最大值
    max_words=2000,  # 设置最大显示字数
    stopwords={'的'}  # 设置停用词,停用词则不在词云途中表示
                 ).generate(space_word_list)
image = word.to_image()
word.to_file('bsx.png')  # 保存图片
image.show()

最后运行:


八.总结

本文使用selenium采集QQ音乐评论数据,其实使用selenium模拟人操作浏览器,可以避免一些反爬,不失为一种获取数据的好方法,但是需要注意的点还是有的,最后感兴趣的小伙伴可以去尝试一下。

接下来是今天的送书时间了,今天给大家带来的是《GAN生成对抗神经网络》

如果喜欢本文

欢迎 在看留言分享至朋友圈 三连

公众号回复:送书 ,参与抽奖(共5本)

或者扫一扫下方的二维码回复:送书  即可!

大家如果有什么建议,欢迎扫一扫二维码私聊小编~

回复:加群 可加入Python技术交流群

(扫一扫获取本文源码)

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值