社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

马哥Linux运维 • 3 年前 • 474 次点击  

今天给大家带来用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模拟人操作浏览器,可以避免一些反爬,不失为一种获取数据的好方法,但是需要注意的点还是有的,最后感兴趣的小伙伴可以去尝试一下。

文章转载:Python编程学习圈
(版权归原作者所有,侵删)

点击下方“阅读原文”查看更多

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/118803
 
474 次点击