Python selenium爬取影评生成词云图

2024-02-29 18:40:09 浏览数 (3)

问题描述

通过中文分词、过滤停用词、生成词云图等步骤对评论数据进行处理和可视化。

效果截图如下

非常nice

问题分析

该程序需要使用 Selenium 库来模拟浏览器操作,因此需要下载安装 Chrome 浏览器以及对应版本的 Chromedriver。 程序中需要读取本地 stopwords.txt 文件中的停用词列表,因此需要先准备好该文件。 生成的词云图字体需要下载并放到与文件同级的目录上

前期准备

代码中用到的库和版本如下

  • Selenium (3.141.0)
  • jieba (0.42.1)
  • wordcloud (1.8.1)
  • matplotlib(3.4.2)
  • numpy (1.20.3)

运行命令 pip install selenium jieba wordcloud matplotlib numpy 进行下载

完整代码及解释

代码语言:javascript复制
# 导入所需库
from selenium import webdriver  # 网页自动化测试工具
from selenium.webdriver.common.by import By  # 定位元素方法
import jieba  # 中文分词库
from wordcloud import WordCloud  # 词云库
import matplotlib.pyplot as plt  # 数据可视化库
import numpy as np  # 数学计算库
import os  # 操作系统接口库

# 创建浏览器对象并打开目标网页
browser = webdriver.Chrome()  # 创建 Chrome 浏览器对象
url = 'https://movie.douban.com/subject/34841067/comments?status=P'  # 目标网页的 URL
browser.get(url)  # 打开目标网页

# 定义选择器和结果列表
selector = 'span.short'  # CSS 选择器,表示评论所在的元素
results = []  # 用于存储获取到的评论

# 判断是否存在下一页按钮,不断翻页并获取评论数据
while True:
    elements = browser.find_elements(By.CSS_SELECTOR, selector)  # 使用选择器查找所有评论元素
    for element in elements:
        comment = element.text.strip()  # 获取元素的文本,去除空格和换行符
        if len(comment) > 0:  # 如果评论非空
            results.append(comment)  # 存储该评论
    # 点击下一页按钮
    try:
        next_btn = browser.find_element(By.LINK_TEXT, '后页>')  # 查找“下一页”按钮元素
        next_btn.click()  # 点击“下一页”按钮
    except:
        break  # 如果没有找到“下一页”按钮,说明已经到达最后一页,退出循环

# 关闭浏览器对象
browser.quit()  # 关闭浏览器

# 合并所有评论文本
text = 'n'.join(results)  # 将所有评论文本拼接成一个字符串,用换行符隔开

# 使用 jieba 分词库进行中文分词
words = jieba.cut(text)  # 对评论文本进行中文分词,返回一个生成器对象

# 获取停用词列表
stop_words_path = 'stopwords.txt'  # 停用词文件的路径
with open(stop_words_path, encoding='utf-8') as f:
    stop_words = f.read().splitlines()  # 读取停用词文件,将每行转换为一个元素,存储为列表

# 过滤出有效词汇
valid_words = [word for word in words if word not in stop_words]  # 过滤掉停用词,仅保留有效词汇

# 将过滤后的词汇拼接成字符串
valid_text = ' '.join(valid_words)  # 将词汇列表中的所有元素拼接成一个字符串,用空格隔开

# 创建词云对象
wc = WordCloud(
    font_path="PingFang Bold.ttf",  # 指定词云字体
    width=800,  # 词云图像宽度
    height=600,  # 词云图像高度
    background_color='white',  # 背景颜色
    max_words=200,  # 最大显示单词数
    max_font_size=80,  # 最大字号
    random_state=42  # 随机状态
)

# 生成词云图
wc.generate(valid_text)  # 生成词云图像数据

# 定义输出路径
output_dir = 'output'  # 词云图像输出路径
output_path = os.path.join(output_dir, 'wordcloud.png')  # 拼接输出文件路径

# 检查输出目录是否存在
if not os.path.exists(output_dir):  # 如果输出目录不存在
    os.makedirs(output_dir)  # 创建该目录及其所有父目录

# 输出词云图
wc.to_file(output_path)  # 将词云图像输出到指定文件

# 显示词云图
plt.imshow(wc, interpolation='bilinear')  # 将词云图像显示出来,使用双线性差值算法平滑显示
plt.axis('off')  # 不显示坐标轴
plt.show()  # 显示图像

字体素材

链接: https://pan.baidu.com/s/1-nXL9-8NRbWPd2m4AGOUNw 提取码: esf2

1 人点赞