当前位置:   article > 正文

QQ音乐歌曲评论获取(python)_qq音乐评论区数据获取

qq音乐评论区数据获取

引言

网上找了很久都没有QQ音乐评论获取的有效方法,其次就是现在QQ音乐都是动态加载评论内容,所以用了一个很笨的方法获取歌曲评论:

  • selenium库滚动页面
  • 保存某时刻的HTML文件
  • BeautifulSoup库解析保存的HTML文件

这个方法有点耗时间,并且滚动到十万条评论之后,页面会出错。但对于几千和几万评论的歌曲还是可以胜任。
在这里插入图片描述
在这里插入图片描述

这是显示十万条评论后保存的HTML文件,很大,使用python读取也很花时间(30s左右)。

解析页面

BeautifulSoup解析之后的内容。
在这里插入图片描述
在这里插入图片描述
找到评论区位置后再往下找找,其实观察解析内容可以发现,蓝色的超链接是评论用户的头像,所以只需要数一下有多少条近期热评和精彩评论,就能找到全部评论的位置。
歌曲每首歌一般都是20条近期热评和精彩评论,往下数20条超链接就能找到。

在这里插入图片描述
在这里插入图片描述
对比上下两个图片可以看到,评论是放在一个class="comment__list_item c_b_normal"li中,使用contents=soup.find_all('li', class_='c_b_normal')找出相应内容即可。
在这里插入图片描述
找出每隔用户评论的li之后,使用print(contents[-1].prettify())再看看具体内容在哪里。
在这里插入图片描述
现在可以获取相关内容。

username = contents[-1].find('a', class_='c_tx_thin').text.strip()  # 提取网名
comment_content = contents[-1].find('p', class_='comment__text').text.strip()  # 提取评论内容
timestamp = contents[-1].find('div', class_='comment__date').text.strip()  # 提取时间、地点
split_timestamp = timestamp.split('来自', 1)
times = split_timestamp[0]  # 时间
location = split_timestamp[1]

print('用户:',username)
print('评论:',comment_content)
print('时间:',times)
print('地点:',location)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这里插入图片描述

完整代码

import time
import selenium
import json
import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver

driver = webdriver.Edge()  # 创建Edge浏览器实例
driver.get(r'https://y.qq.com/n/ryqq/songDetail/0039MnYb0qxYhV')  # 打开网页

try:
    scroll_count = 0  #计数:没滚动60次保存一次结果
    while True:
        # 向下滚动2000像素
        driver.execute_script("window.scrollBy(0, 2000);")
        # 等待2秒
        time.sleep(2)
        # 增加滚动计数
        scroll_count += 1
        if (scroll_count%60 == 0):
            # 获取当前页面的 HTML 内容并保存
            name = time.strftime('%Y-%m-%d_%H:%M:%S')
            path = f'QQ音乐/HTML/page.html'
            page_source = driver.page_source
            with open(path, 'w', encoding='utf-8') as file:
                file.write(page_source)
    
            # 打开保存的 HTML
            with open(path, 'r', encoding='utf-8') as file:
                html_content = file.read()
    
            # 使用Beautiful Soup解析HTML
            soup = BeautifulSoup(html_content, 'lxml')
            try:
                # 查找包含评论的<ul>元素
                contents = soup.find_all('li', class_='c_b_normal')
                
                # 初始化列表,用于存储四个指标的数据
                data = []
                # 遍历每条评论
                for content in contents:
                    try:
                        username = content.find('a', class_='c_tx_thin').text.strip()  # 提取网名
                    except:
                        username = '暂无数据'
                    try:
                        comment_content = content.find('p', class_='comment__text').text.strip()  # 提取评论内容
                    except:
                        comment_content = '暂无数据'
                    try:
                        timestamp = content.find('div', class_='comment__date').text.strip()  # 提取时间、地点
                        split_timestamp = timestamp.split('来自', 1)
                        try:
                            times = split_timestamp[0]  # 时间
                        except:
                            times = '暂无数据'
                        try:
                            location = split_timestamp[1]
                        except:
                            location = '暂无数据'
                    except:
                        continue
                    
                    # 将四个指标的数据存入字典
                    comment_data = {
                        'Username': username,
                        'CommentContent': comment_content,
                        'Time': times,
                        'Location': location
                    }
                
                    # 将字典添加到数据列表
                    data.append(comment_data)
                
                # 创建DataFrame并保存
                df = pd.DataFrame(data)
                df.to_csv(f'QQ音乐/CSV/{name}.csv', index=False, encoding='utf8')
    
            except:
                print(f'错误{name}')

except KeyboardInterrupt:
    # 捕获键盘中断(Ctrl+C),例如用户手动停止脚本
    pass
    
finally:
    # 关闭浏览器
    driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88

结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/409095
推荐阅读
相关标签
  

闽ICP备14008679号