【Python】网络爬虫——词云wordcloud详细教程,爬取豆瓣最新评论并生成各式词云

news2025/5/17 0:21:45

目录

一、功能介绍

二、关键技术

1、安装WordCloud

2、利用WordCloud

1、WordCloud的基础用法

**相关参数介绍**

**WordCloud 提供的方法如下**

2、WordCloud的应用举例

3、设置停用词

4、WordCloud使用词频

三、程序设计的步骤

1、抓取网页数据

2、数据清洗

3、用词云进行展示

四、实现代码

五、最终效果展示


一、功能介绍

词云,即:对网络文本中出现频率较高的“关键词”予以视觉上的突出,形成“关键词云层”或“关键词渲染”,从而过滤掉大量的文本信息,使浏览网页者只要扫过一眼文本就可以领略文本的主旨。

本项目用来爬取豆瓣网上最新的电影评论(以最新上映的:异形:夺命舰 Alien: Romulus为例),经过数据清理和词频统计后进行词云展示。

二、关键技术

1、安装WordCloud

pip install wordcloud

2、利用WordCloud

1、WordCloud的基础用法
class wordcloud.WordCloud(font path=None, width=400, height=200, margin=2, ranks only=None, prefer horizontal=0.9, mask=None, scale=1, color func=None, max words=200, min font size=4, stopwords=None, random state=None, background color='black', max font size=None, font step=1, mode='RGB', relative scaling=0.5, regexp=None, collocations=True, colormap=None, normalize_plurals=True)
**相关参数介绍**
  • font_path:需要展现什么字体就把该字体路径+扩展名写上,例如:font_path = ‘黑体.ttf’。
  • width:输出的画布宽度,默认为400像素
  • height:输出的画布高度,默认为200像素
  • prefer_horizontal:词语水平方向排版出现的频率,默认为 0.9(所以词语垂直方向排版出现的频率为 0.1)。
  • mask:如果该参数为空,则使用二维遮罩绘制词云;如果该参数非空,设置的宽高值将被忽略,遮罩形状将被 mask 取代。除了全白(#FFFFFF)部分不会绘制以外,其余部分会用于绘制词云。例如bg_pic= imread(‘读取一张图片.png’),背景图片的画布一定要设置为白色(#FFFFFF),然后显示的形状为不是白色的其他颜色。用户可以用 PS 工具将自己要显示的形状复制到一个纯白色的画布上,然后保存。
  • Scale:按照比例放大画布,例如设置为1.5,则长和宽都是原来画布的 1.5 倍。
  • min_font_size:显示的最小的字体大小。
  • font_step:字体步长,如果步长大于1,会加快运算,但是可能导致结果出现较大的误差。
  • max_words:要显示的词的最大个数。
  • stopwords:设置需要屏蔽的词,如果为空,则使用内置的STOPWORDS。
  • background_color:背景颜色,例如 background color=‘white’,背景颜色为白色,默认颜色为黑色。
  • max_font_size:显示的最大的字体大小。
  • mode:当该参数为 “RGBA” 并且 background_color 不为空时背景透明。
  • relative_scaling:词频和字体大小的关联性。
  • color_func:生成新颜色的函数,如果为空,则使用selfcolor_func。
  • regexp:使用正则表达式分隔输入的文本。
  • collocations:是否包括两个词的搭配。
  • colormap:给每个单词随机分配颜色,若指定color func,则忽略该方法。

**WordCloud 提供的方法如下**
  • fit_words(frequencies):根据词频生成词云。
  • generate(text):根据文本生成词云。
  • generate_from_frequencies(frequencies[…]):根据词频生成词云。
  • generate_from_text(text):根据文本生成词云。
  • process_text(text):将长文本分词并去除屏蔽词(此处指英语,中文分词还需要自己用其他库先行实现,使用上面的fit_words(fequencies))。
  • recolor([random_state,color_func,colormap]):对现有输出重新着色,重新着色会比重新生成整个词云快很多。
  • to_array():转化为 numpy array。
  • to_file(filename):输出到文件。

2、WordCloud的应用举例
from wordcloud import WordCloud, ImageColorGenerator, STOPWORDS
import matplotlib.pyplot as plt
from PIL import Image  # 使用Pillow库代替scipy.misc.imread
import numpy as np

text = open('test.txt', 'r',encoding='utf-8').read()  # 读取一个txt文件
bg_pic = Image.open('alice.png')  # 读取背景图片
'''设置词云样式'''
wc = WordCloud(background_color='White', mask=np.array(bg_pic), font_path="simhei.ttf", max_words=2000, max_font_size=150,
               random_state=30, scale=1.5)
wc.generate_from_text(text)  # 根据文本生成词云

image_colors = ImageColorGenerator(np.array(bg_pic))  # 确保bg_pic是数组格式
plt.imshow(wc)  # 展示词云图
plt.axis('off')
plt.show()
print('display success!')

# 保存词云图片
wc.to_file('test2.jpg')

运行结果:

3、设置停用词

用户可以手动设置停用词,使得词云中不显示该词。

from os import path
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator, STOPWORDS  # 词云包

# 读取整个文章
text = open('test.txt', 'r', encoding='utf-8').read()  # 读取一个txt文件
# 读取遮罩/彩色图像
alice_coloring = np.array(Image.open('alice.png'))  # 读取背景图片
# 设置停用词
stopwords = set(STOPWORDS)
stopwords.add("的")  # 人工添加停用词
stopwords.add("了")  # 人工添加停用词

# 可以通过mask参数来设置词云形状
wc = WordCloud(background_color='White', mask=np.array(alice_coloring), font_path="simhei.ttf", max_words=2000,
               stopwords=stopwords, max_font_size=40,
               random_state=42)
# 生成词云
wc.generate(text)
# 根据图片生成颜色
image_colors = ImageColorGenerator(np.array(alice_coloring))  # 确保bg_pic是数组格式
plt.imshow(wc, interpolation="bilinear")  # 展示词云图
plt.axis('off')
plt.show()

# 保存词云图片
wc.to_file('test2.jpg')

运行结果:

4、WordCloud使用词频
import jieba.analyse
from PIL import Image, ImageSequence
import numpy as np
import matplotlib.pyplot as plt

from wordcloud import WordCloud, ImageColorGenerator, STOPWORDS  # 词云包

lyric = ''
f = open('./test.txt', 'r', encoding='utf-8')
for i in f:
    lyric += f.read()
# 用jieba对文章做分词,提取出词频高的前50个词
result = jieba.analyse.textrank(lyric, topK=50, withWeight=True)
keywords = dict()
for i in result:
    keywords[i[0]] = i[1]
print(keywords)

运行结果:

三、程序设计的步骤

1、抓取网页数据

查找页面中id为’nowplaying’的div标签:

在找到的div标签内,查找所有class为’list-item’的li标签:

2、数据清洗

** 消除与数据分析无关的数据 **

1、正则表达式去除非中文字符:

pattern = re.compile(r'[^ws]')
cleaned_comments = pattern.sub('', comments)

2、停用词过滤:

stopwords = set(STOPWORDS)
with open('./StopWords.txt', encoding="utf-8") as f:
    stopwords.update(word.strip() for word in f)
keywords = {word: score for word, score in keywords.items() if word not in stopwords}

3、使用jieba进行中文分词:

result = jieba.analyse.textrank(cleaned_comments, topK=150, withWeight=True)

3、用词云进行展示

1、创建词云对象:

wordcloud = WordCloud(font_path="simhei.ttf", mask=np.array(bg_pic), background_color="white",
                     max_font_size=80, stopwords=stopwords).generate_from_frequencies(keywords)

2、展示词云:

plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()

3、打印成功信息:

print('词云展示成功!')

四、实现代码

import warnings
import jieba
import jieba.analyse

import re
import matplotlib.pyplot as plt
import requests
from bs4 import BeautifulSoup as bs
from wordcloud import WordCloud, STOPWORDS


# 忽略警告
warnings.filterwarnings("ignore")

# 设置matplotlib图形大小
plt.rcParams['figure.figsize'] = (10.0, 5.0)


# 分析网页函数
def getNowPlayingMovieList():
    url = 'https://movie.douban.com/nowplaying/guangzhou'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
    }
    try:
        resp = requests.get(url, headers=headers)
        resp.raise_for_status()  # 检查请求是否成功
        html = resp.text
    except requests.exceptions.HTTPError as errh:
        print(f"HTTP错误: {errh}")
        return []
    except requests.exceptions.RequestException as err:
        print(f"请求错误: {err}")
        return []
    soup = bs(html, 'html.parser')
    nowplaying_movie = soup.find('div', id='nowplaying')
    if not nowplaying_movie:
        return []
    nowplaying_movie_list = nowplaying_movie.find_all('li', class_='list-item')
    nowplaying_list = []
    for item in nowplaying_movie_list:
        nowplaying_dict = {}
        nowplaying_dict['id'] = item['data-subject']
        nowplaying_dict['name'] = item.find('img')['alt']
        nowplaying_list.append(nowplaying_dict)
    return nowplaying_list


# 爬取评论函数
def getCommentsById(movieId, pageNum):
    eachCommentList = []
    if pageNum <= 0:
        return eachCommentList
    start = (pageNum - 1) * 20
    url = f'https://movie.douban.com/subject/{movieId}/comments?start={start}&limit=20'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
    }
    try:
        resp = requests.get(url, headers=headers)
        resp.raise_for_status()  # 检查请求是否成功
        html = resp.text
    except requests.exceptions.HTTPError as errh:
        print(f"HTTP错误: {errh}")
        return []
    except requests.exceptions.RequestException as err:
        print(f"请求错误: {err}")
        return []
    soup = bs(html, 'html.parser')
    comment_div_lits = soup.find_all('div', class_='comment')
    for item in comment_div_lits:
        if item.find('p'):
            eachCommentList.append(item.find('p').text.strip())
    return eachCommentList


def main():
    NowPlayingMovie_list = getNowPlayingMovieList()
    if not NowPlayingMovie_list:
        print("没有获取到电影列表")
        return

    commentList = []
    for i in range(1, 11):  # 从第1页到第10页
        comments_temp = getCommentsById(NowPlayingMovie_list[0]['id'], i)  # 选择第几个电影来进行爬虫,[0]为第一个
        commentList.extend(comments_temp)

    comments = " ".join(commentList)
    # 使用正则表达式去掉标点符号和非中文字符
    pattern = re.compile(r'[^ws]')
    cleaned_comments = pattern.sub('', comments)

    # 使用jieba分词进行中文分词
    result = jieba.analyse.textrank(cleaned_comments, topK=150, withWeight=True)
    keywords = {word: weight for word, weight in result}

    # 停用词集合
    stopwords = set(STOPWORDS)
    with open('./StopWords.txt', encoding="utf-8") as f:
        stopwords.update(word.strip() for word in f)

    # 过滤停用词
    keywords = {word: score for word, score in keywords.items() if word not in stopwords}

    # 创建词云
    wordcloud = WordCloud(font_path="simhei.ttf", background_color="white",
                          max_font_size=80,
                          stopwords=stopwords).generate_from_frequencies(keywords)
    plt.imshow(wordcloud, interpolation='bilinear')
    plt.axis("off")
    plt.show()
    print('词云展示成功!')


if __name__ == "__main__":
    main()

五、最终效果展示

PS:当然也可以对上述词云进行上面介绍过的形状上的一些处理:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2307938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第39天:安全开发-JavaEE应用SpringBoot框架Actuator监控泄漏Swagger自动化

时间轴&#xff1a; Java知识点&#xff1a; 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&#xff0c;第三方组件使用等. 框架库&#xff1a;MyBatis&#xff0c;SpringMVC&#xff0c;SpringBoot&#xf…

综合练习 —— 递归、搜索与回溯算法

目录 一、1863. 找出所有子集的异或总和再求和 - 力扣&#xff08;LeetCode&#xff09; 算法代码&#xff1a; 代码思路 问题分析 核心思想 实现细节 代码解析 初始化 DFS 函数 时间复杂度 空间复杂度 示例运行 输入 运行过程 总结 二、 47. 全排列 II - 力扣&a…

【Java SE】Java中String的内存原理

参考笔记&#xff1a; Java String 类深度解析&#xff1a;内存模型、常量池与核心机制_java stringx、-CSDN博客 解析java中String的内存原理_string s1 new string("ab");内存分析-CSDN博客 目录 1.String初识 2.字符串字面量 3.内存原理图 4. 示例验证 4.…

IDEA提示将方法形参更改为(什么什么类型),要检查对应的实体类中的字段类型是否正确

IDEA提示inviteCodeId应该是字符串&#xff0c;明显不对&#xff0c;后来检查发现是FakeRegistration类中把inviteCodeId定义为String类型了。

【芯片设计】NPU芯片前端设计工程师面试记录·20250227

应聘公司 某NPU/CPU方向芯片设计公司。 小声吐槽两句,前面我问了hr需不需要带简历,hr不用公司给打好了,然后我就没带空手去的。结果hr小姐姐去开会了,手机静音( Ĭ ^ Ĭ )面试官、我、另外的hr小姐姐都联系不上,结果就变成了两个面试官和我一共三个人在会议室里一人拿出…

初阶数据结构(C语言实现)——3顺序表和链表(3)

3.链表 3.1 链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 链表的物理结构 1.从上图可看出&#xff0c;链式结构在逻辑上是连续的&#xff0c;但是在物理上不一定连续…

使用 VSCode 代替 BeyondStudio for NXP 开发 JN 5169

使用 VSCode 代替 BeyondStudio for NXP 开发 JN 5169 一、安装 VSCode二、搭建 NXP JN5169 ZigBee 3.0 开发环境和下载示例工程三、配置 VSCode1、配置环境变量 MYSYS_HOME2、VSCode 安装以下插件3、VSCode 配置头文件路径 四、编译工程1、JN-AN-1219 有 6 个构建选项2、修改 …

DBGPT安装部署使用

简介 DB-GPT是一个开源的AI原生数据应用开发框架(AI Native Data App Development framework with AWEL(Agentic Workflow Expression Language) and Agents)。 目的是构建大模型领域的基础设施&#xff0c;通过开发多模型管理(SMMF)、Text2SQL效果优化、RAG框架以及优化、Mul…

How to use VRX on ubuntu20.04 with ROS1 Noetic?[2]

How to use VRX on ubuntu20.04 with ROS1 Noetic?[2] 1.Which topics2.Control1.1操作模拟船&#xff08;1&#xff09;命令行直接发布&#xff08;2&#xff09;启动键盘控制文件 3.Customer your VRX world3.1Which world parameters3.2改变风的参数 3.2.1更改默认参数&…

yolov8 目标追踪 (源码 +效果图)

1.在代码中 增加了s键开始追踪 e键结束追踪 显示移动距离(代码中可调标尺和像素的比值 以便接近实际距离) 2.绘制了监测区域 只在区域内的检测 3.规定了检测的类别 只有人类才绘制轨迹 import osimport cv2 from ultralytics import YOLO from collections import defaultdic…

基于Python的web漏洞挖掘,漏洞扫描系统(附源码,部署)

本次技术通过利用Python技术来开发一款针对web漏洞挖掘扫描的技术&#xff0c;通过web漏洞的挖掘扫描来实现对网站URL的漏洞检测&#xff0c;通过高中低风险的判断来实现对一款网站中存在的漏洞进行可视化的分析&#xff0c;从而能够找到问题并且尽快的实现问题的解决。 博主介…

岳阳市美术馆预约平台(小程序论文源码调试讲解)

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的&#xff0c;在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值&#xff0c;吸引更多的访问者访问系统&#xff0c;以及让来访用户可以花费更多时间停留在系统上&#xff0c;则表明该系统设计得比较专…

ubuntu22.04系统如何自建2级ntp服务器

一&#xff1a;ntp服务器详情 服务器型号 系统版本 IP地址 主机名 ntp服务版本 虚拟机8c-32g-1T Ubuntu22.04 10.20.30.2 DMZ-NTP-SERVER 4.2.8p15 二&#xff1a;ntp服务端部署配置脚本 #!/bin/bash # 脚本信息 echo "--------------------------…

DeepSeek赋能智慧社区:提升社区治理,优化资源配置,带来全新变革

在数字化浪潮的推动下&#xff0c;智慧社区正逐渐成为城市发展的重要方向。作为一款先进的人工智能大模型&#xff0c;DeepSeek凭借其强大的多模态数据分析和智能决策能力&#xff0c;正在为智慧社区的建设注入新的活力。 标准规范及顶层设计指南、供应商整体解决方案合集、供应…

spring注解开发(Spring整合MyBatis——Mapper代理开发模式、(Spring、MyBatis、Jdbc)配置类)(6)

目录 一、纯MyBatis独立开发程序。 &#xff08;1&#xff09;数据库与数据表。 &#xff08;2&#xff09;实体类。 &#xff08;3&#xff09;dao层接口。&#xff08;Mapper代理模式、无SQL映射文件——注解配置映射关系&#xff09; &#xff08;4&#xff09;MyBatis核心配…

【MySQL】数据库-图书管理系统(CC++实现)

一.预期功能 该图书管理系统设计提供基本的设计模版&#xff0c;涉及数据库的增删查改等操作&#xff0c;包含登录功能&#xff0c;图书管理功能&#xff0c;图书借阅功能&#xff0c;用户管理功能等基础功能&#xff0c;详细功能查看以下菜单表&#xff0c;共包含三个菜单&am…

VSCode轻松调试运行C#控制台程序

1.背景 我一直都是用VS来开发C#项目的&#xff0c;用的比较顺手&#xff0c;也习惯了。看其他技术文章有介绍VS Code更轻量&#xff0c;更方便。所以我专门花时间来使用VS Code&#xff0c;看看它是如何调试代码、如何运行C#控制台。这篇文章是一个记录的过程。 2.操作 2.1 V…

python-leetcode-下一个排列

31. 下一个排列 - 力扣&#xff08;LeetCode&#xff09; class Solution:def nextPermutation(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""# Step 1: Find the first decreasing element …

Jsmoke-一款强大的js检测工具,浏览器部署即用,使用方便且高效

目录标题 Jsmoke &#x1f6ac;&#x1f6ac; by Yn8rt使用方式界面预览功能特性支持的敏感信息类型 Jsmoke &#x1f6ac;&#x1f6ac; by Yn8rt ​ 该插件由 Yn8rt师傅 开发&#xff0c;插件可以理解为主动版的hae和apifinder&#xff0c;因为其中的大多数规则我都引用了&a…

iphone上ios设备开启safari开发者debug模式,配合mac电脑使用

1.mac操作 mac的safari上打开开发者模式&#xff0c;打开显示网页开发者功能 2.开启IPhone的Safari调试模式 启用 Web 检查 功能&#xff0c;打开 iPhone 依次进入 设置 > Safari浏览器 > 高级 > 网页检查器 > 启用。 3.调试步骤 先用IPhone 的Safari打开要调试…