当前位置: 首页 > article >正文

豆瓣图书评论数据分析与可视化

【题目描述】豆瓣图书评论数据爬取。以《平凡的世界》、《都挺好》等为分析对象,编写程序爬取豆瓣读书上针对该图书的短评信息,要求:

(1)对前3页短评信息进行跨页连续爬取;

(2)爬取的数据包含用户名、短评内容、评论时间、评分和点赞数(有用数);

(3)能够根据选择的排序方式(热门或最新)进行爬取,并分别针对热门和最新排序,输出前10位短评信息(包括用户名、短评内容、评论时间、评分和点赞数)。

(4)根据点赞数的多少,按照从多到少的顺序将排名前10位的短评信息输出;

(5附加)结合中文分词和词云生成,对前3页的短评内容进行文本分析:按照词语出现的次数从高到低排序,输出前10位排序结果;并生成一个属于自己的词云图形。

1. 抓取获取<<都挺好>>短评的 url

https://book.douban.com/subject/20492971/comments/?start=20&limit=20&status=P&sort=score
分析url

  • subject/20492971:书籍ID为20492971
  • comments/:评论页面
  • start=20:从第20条评论开始显示(分页参数)
  • limit=20:每页显示20条评论
  • status=P:只显示已发布的评论(P代表Published)
  • sort=score:按点赞量排序

经分析 sort=time 为按时间排序 (最新) - 需要登录豆瓣

2. 获取headers 和 Cookie
在爬取豆瓣等反爬机制较严格的网站时,​​模拟浏览器行为​​ 是关键。以下是补全的爬虫策略,包括 ​​请求头设置、Cookies、延迟控制、代理IP​​ 等关键点:

关键反爬策略​​:

  • 必须配置完整的请求头(Headers)和Cookies
  • 建议使用代理IP池(特别是大规模爬取时)
  • 合理设置请求间隔(本示例未展示,但生产环境建议添加)

分享一个好用的网站 

Convert curl commands to Python 

它可以将 cURL 命令快速转换为 Python、JavaScript、PHP 等多种语言的代码,非常适合爬虫开发时快速生成请求模板。

使用方法 :  以cURL(bash)格式复制 , 复制到网站

复制到curl command , 下方会自动生成代码 , 可以选择不同的语言

有了cookies 和 headers 剩下的就是爬虫的基本功了


    代码:

    import matplotlib
    import requests
    from lxml import etree
    import jieba
    from collections import Counter
    from wordcloud import WordCloud
    import matplotlib.pyplot as plt
    matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体为 SimHei
    matplotlib.rcParams['axes.unicode_minus'] = False    # 正确显示负号
    cookies = {# 你的cookies
    }headers = {# 你的headers
    }
    # proxies = {
    #     # 可以配置一个代理池
    #     # 'http': 'http://120.25.1.15:7890',
    #     # 'https': 'http://120.25.1.15:7890',# }def get_comment(page, sort_type, comment_list):url = f'https://book.douban.com/subject/20492971/comments/?start={page * 20}&limit=20&sort={sort_type}&status=P'response = requests.get(url, cookies=cookies, headers=headers)response.encoding = 'utf-8'tree = etree.HTML(response.text)li_list = tree.xpath('//*[@id="comments"]/div[1]/ul/li')for li in li_list:try:like_count = li.xpath('./div[2]/h3/span[1]/span/text()')[0].strip()name = li.xpath('./div[2]/h3/span[2]/a[1]/text()')[0].strip()score = li.xpath('./div[2]/h3/span[2]/span/@title')[0].strip()time = li.xpath('./div[2]/h3/span[2]/a[2]/text()')[0].strip()comment = li.xpath('./div[2]/p/span/text()')[0].strip()comment_list.append({'name': name,'score': score,'time': time,'like_count': like_count,'comment': comment})except Exception:continueprint(f'第{page + 1}页爬取成功')def analyze_text(comment_list):all_text = ''.join([c['comment'] for c in comment_list])words = jieba.lcut(all_text)# 去除常见无意义词(可根据需要扩展)stop_words = set(['的', '了', '和', '是', '我', '也', '就', '都', '很', '在', '有', '不', '人'])words = [word for word in words if len(word) > 1 and word not in stop_words]# 统计词频word_counts = Counter(words)top_words = word_counts.most_common(10)print("词频前10名:")for i, (word, count) in enumerate(top_words, 1):print(f"{i}. {word}:{count} 次")# 生成词云wc = WordCloud(font_path='simhei.ttf',  # 确保有中文字体background_color='white',width=800,height=600).generate_from_frequencies(word_counts)plt.figure(figsize=(10, 6))plt.imshow(wc, interpolation='bilinear')plt.axis('off')plt.title("豆瓣短评词云", fontsize=18)plt.show()wc.to_file("wordcloud.png")def main():choice = input("请输入查看类型(1:热门评论,2:最新评论):")if choice == '1':sort_type = 'score'elif choice == '2':sort_type = 'time'else:print("无效输入,默认使用热门评论。")sort_type = 'score'comment_list = []for i in range(3):get_comment(i, sort_type, comment_list)# 展示前10条评论print("\n前10条评论:\n")for i, c in enumerate(comment_list[:10], 1):print(f"{i}. {c['name']} | {c['score']} | {c['time']} | 赞:{c['like_count']}\n评论:{c['comment']}\n")# 分析评论文本analyze_text(comment_list)if __name__ == '__main__':main()
    

    需要替换为你的

    安装包的命令

    # 基础请求与解析库
    pip install requests lxml jieba# 词云与数据分析库
    pip install wordcloud matplotlib

    完成 

    技术要点解析

    1. ​反爬对策​​:

      • 使用真实浏览器的Headers和Cookies
      • 建议添加随机延迟(time.sleep(random.uniform(1,3)))
      • 重要项目建议使用代理IP池
    2. ​数据解析技巧​​:

      • 使用lxml的XPath定位元素
      • 健壮的异常处理(网络超时、元素不存在等)
      • 数据清洗(去除空白字符等)
    3. ​文本分析优化​​:

      • 扩展停用词表提升分析质量
      • 可考虑添加自定义词典(jieba.load_userdict())
      • 词云可调整参数:背景色、最大词汇数、遮罩形状等

    本项目展示了从数据爬取到分析可视化的完整流程,读者可根据实际需求进行扩展。建议在遵守豆瓣Robots协议的前提下合理使用爬虫技术,注意控制请求频率,避免对目标网站造成负担。

    提醒 : 大规模爬取会被豆瓣封ip

    ​声明​​:本教程仅用于学习交流,请勿用于商业用途或大规模爬取,尊重网站的数据版权。

    相关文章:

    豆瓣图书评论数据分析与可视化

    【题目描述】豆瓣图书评论数据爬取。以《平凡的世界》、《都挺好》等为分析对象&#xff0c;编写程序爬取豆瓣读书上针对该图书的短评信息&#xff0c;要求&#xff1a; &#xff08;1&#xff09;对前3页短评信息进行跨页连续爬取&#xff1b; &#xff08;2&#xff09;爬取…...

    Vue ④-组件通信 || 进阶语法

    组件三大部分 template&#xff1a;只有能一个根元素 style&#xff1a;全局样式(默认)&#xff1a;影响所有组件。局部样式&#xff1a;scoped 下样式&#xff0c;只作用于当前组件 script&#xff1a;el 根实例独有&#xff0c;data 是一个函数&#xff0c;其他配置项一致…...

    0x-2-Oracle Linux 9上安装JDK配置环境变量

    一、JDK选择和使用 安装完Oracle Linux9.6&#xff0c;同时使用rpm包安装Oracle 23 ai free后&#xff0c; 将面临sqlcl程序无法使用和java无法使用&#xff0c;需要相应进行变量配置问题。 1、java 环境运行不存在&#xff0c;Oracle 23ai free安装后默认安装JDK 11 /opt/…...

    深入理解卷积神经网络:从原理到应用

    在人工智能领域&#xff0c;卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;无疑是计算机视觉领域的璀璨明珠。从 1998 年 Yann LeCun 提出 LeNet-5 实现手写数字识别&#xff0c;到 2012 年 AlexNet 在 ImageNet 大赛上创造历史性突破&#xff0c;CNN…...

    从入门到实战:AI学习路线全解析——避坑指南

    分享一下阿里的人工智能学习路线,为感兴趣系统学习的小伙伴们探路。 一、谁适合学这门AI课程?五类人群的精准定位 无论你是零基础小白还是职场转型者,这套系统化课程都能为你量身定制成长路径: 零基础爱好者(无编程/数学背景) 课程提供Python和数学前置学习建议,先补基…...

    Spring Boot + Thymeleaf 防重复提交

    在 Spring Boot 与 Thymeleaf 结合的 Web 应用中&#xff0c;防止重复提交可以采用token 机制 客户端禁用按钮的方式实现&#xff0c;在高并发场景下&#xff0c;考虑使用 Redis 存储 token 而非 Session。 第一步&#xff1a;后端实现 Controller public class FormControl…...

    uniapp实现的简约美观的星级评分组件

    采用 uniapp 实现的一款简约美观的星级评分模板&#xff0c;提供丝滑动画效果&#xff0c;用户可根据自身需求进行自定义修改、扩展&#xff0c;纯CSS、HTML实现&#xff0c;支持web、H5、微信小程序&#xff08;其他小程序请自行测试&#xff09; 可到插件市场下载尝试&#x…...

    AWS Elastic Beanstalk + CodePipeline(Python Flask Web的国区CI/CD)

    目标 需要使用AWS Elastic Beanstalk 部署一个Python的Flask Web应用&#xff0c;并且使用CodePipeline作为CI/CD工作流。 eb部署图 前提 假设你已经有一个能够正常运行的Python的Flask Web应用项目代码&#xff0c;而且需要对已有Flask工程做一些调整。由于AWS Elastic Bea…...

    多线程语音识别工具

    软件介绍 本文介绍一款支持大厂接口的语音转文字工具&#xff0c;具备免配置、免费使用的特点。 软件特性 该工具是一款完全免费的桌面端应用程序&#xff0c;部署于开源社区平台&#xff0c;其核心优势在于整合了多家技术供应商的接口资源。 操作方式 用户只需将音频…...

    前端对WebSocket进行封装,并建立心跳监测

    WebSocket的介绍&#xff1a; WebSocket 是一种在客户端和服务器之间进行全双工、双向通信的协议。它是基于 HTTP 协议&#xff0c;但通过升级&#xff08;HTTP 升级请求&#xff09;将连接转换为 WebSocket 协议&#xff0c;从而提供更高效的实时数据交换。 WebSocket 的特点…...

    DiMTAIC 2024 数字医学技术及应用创新大赛-甲状腺B超静态及动态影像算法赛-参赛项目

    参赛成绩 项目介绍 去年参加完这个比赛之后&#xff0c;整理了项目文件和代码&#xff0c;虽然比赛没有获奖&#xff0c;但是参赛过程中自己也很有收获&#xff0c;自己一个人搭建了完整的pipeline并基于此提交了多次提高成绩&#xff0c;现在把这个项目梳理成博客&#xff0c…...

    window安装docker\docker-compose

    安装前配置 打开控制面板,参照下图打开“启动或关闭windows功能”,Hyper-V 和容器需要启用 程序和功能 启动或关闭windows功能 勾选Hyper-V 安装路径配置 Docker在Windows上的默认安装路径为C:\Program Files\Docker。 以管理员身份运行CMD在D盘,dev文件夹下创建Docker文…...

    Jenkins的学习与使用(CI/CD)

    文章目录 前言背景CI/CDJenkins简介Jenkins特性 安装Jenkins工作流程&#xff08;仅供参考&#xff09;安装maven和其他插件新建任务任务源码管理配置maven配置git&#xff08;非必需&#xff09; 尝试手动构建jar包可能遇到的错误 发布到远程服务器前置清理工作构建触发器git钩…...

    vue-14(使用 ‘router.push‘ 和 ‘router.replace‘ 进行编程导航)

    使用 ‘router.push’ 和 ‘router.replace’ 进行编程导航 编程导航是使用 Vue Router 构建动态和交互式 Web 应用程序的一个重要方面。它允许您根据应用程序逻辑、用户作或特定条件控制用户的导航流。您可以使用 router.push 和 router.replace 方法以编程方式导航到不同的路…...

    使用WPF的Microsoft.Xaml.Behaviors.Wpf中通用 UI 元素事件

    Nuget下载之后记得要先引用下面的 xmlns:i"http://schemas.microsoft.com/xaml/behaviors" <!-- 鼠标事件 --> <i:EventTrigger EventName"MouseEnter"/> <!-- 鼠标进入 --> <i:EventTrigger EventName"MouseLeave"/&g…...

    Elasticsearch中的监控(Monitoring)功能介绍

    Elasticsearch 的 监控&#xff08;Monitoring&#xff09; 功能用于实时跟踪集群的运行状态、性能指标和资源使用情况&#xff0c;帮助管理员及时发现潜在问题、优化配置并确保集群稳定高效运行。它通过内置工具和集成方案&#xff0c;提供从节点到集群、从硬件到服务层的全方…...

    Centos7.6图文安装mysql8.4详细步骤记录

    1 前提条件 1.1 关闭数据库服务器的防火墙 # 关闭数据库服务器的防火墙 systemctl stop firewalld systemctl disable firewalld 1.2 关闭SELinux # 编辑 /etc/selinux/configvi /etc/selinux/config#内容更改为disabledSELINUXdisabled 1.3 卸载系统自身带的mysql&#…...

    AI短视频创富营

    课程内容&#xff1a; 相关资料 【第一章】前期准备 001.【涨粉技巧】新账号如何快速涨粉?_ev(1).mp4 002.【带贷权限】如何开通账号带贷权限?(1).mp4 003.【费用缴纳】如何缴纳账号保证金?_ev(1).mp4 004.【账号检测】如何检测账号是否限流?(1).mp4 005.【风险规避…...

    C++.OpenGL (4/64)纹理(Texture)

    纹理(Texture) 纹理映射核心流程 #mermaid-svg-XxVbt4fizulzb5H3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-XxVbt4fizulzb5H3 .error-icon{fill:#552222;}#mermaid-svg-XxVbt4fizulzb5H3 .error-text{fill:…...

    spring中的@RabbitListener注解详解

    基本用法主要属性1. queues / queueNames2. containerFactory3. id4. concurrency5. ackMode6. priority7. bindings 高级特性1. 消息转换器2. 手动确认3. 条件监听4. 错误处理 配置监听容器工厂注意事项完整示例循环依赖解决1. 使用 Setter 注入2. 使用 Lazy 注解3. 重构代码结…...

    MySQL-运维篇

    运维篇 日志 错误日志 错误日志是 MySQL 中最重要的日志之一&#xff0c;它记录了当 mysqld 启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息当数据库出现任何故障导致无法正常使用时&#xff0c;建议首先查看此日志。 该日志是默认开启的&am…...

    深度优先算法学习

    1: 从 1点出发到 15点 #include <stdio.h>#define MAX_NODES 100typedef struct {int node_id;int *nextNodes;int nextNodesSize; } Node;// 假设我们有一个节点数组&#xff0c;全局保存了所有节点 Node nodes[MAX_NODES];void dfs(int node_id) {Node *node &n…...

    青少年编程与数学 01-011 系统软件简介 08 Windows操作系统

    青少年编程与数学 01-011 系统软件简介 08 Windows操作系统 1. Windows操作系统的起源与发展1.1 早期版本&#xff08;1985-1995&#xff09;1.2 Windows 9x系列&#xff08;1995-2000&#xff09;1.3 Windows NT系列&#xff08;1993-2001&#xff09;1.4 Windows XP及以后版…...

    前端技能包

    ES6 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><script>// 变量定义var a1;let b5; // 现在使用let 定义变量// 对象解构let person{&quo…...

    Vue-github 用户搜索案例

    一、前言 在 Vue 开发中&#xff0c;与后端或第三方 API 接口进行交互是非常常见的需求。GitHub 提供了开放的 RESTful API&#xff0c;非常适合用来练习 Vue 的异步请求和数据绑定功能。 本文将带你一步步实现一个完整的 GitHub 用户搜索系统&#xff0c;包括&#xff1a; …...

    Mac版Visual Studio Code Copilot 无法使用的解决方法

    1 app文件夹删除Visual Studio Code 2 终端里面 输入以下指令&#xff0c;删除各种缓存 rm -fr ~/Library/Preferences/com.microsoft.VSCode.helper.plist rm -fr ~/Library/Preferences/com.microsoft.VSCode.plist rm -fr ~/Library/Caches/com.microsoft.VSCode rm -f…...

    【笔记】PyCharm 使用问题反馈与官方进展速览

    #工作记录 https://youtrack.jetbrains.com/issue/IJPL-190308 【笔记】记一次PyCharm的问题反馈_the polyglot context is using an implementation th-CSDN博客 【笔记】与PyCharm官方沟通解决开发环境问题-CSDN博客 与 JetBrains 官方沟通记录&#xff08;PyCharm 相关问题…...

    操作系统期末版

    文章目录 概论处理机管理进程线程处理机调度生产者消费者问题 死锁简介死锁的四个必要条件解决死锁的方法 存储管理链接的三种方式静态链接装入时动态链接运行时链接 装入内存的三种方式绝对装入可重定位装入动态运行时装入 覆盖交换存储管理方式连续分配**分段存储管理方式***…...

    本地主机部署开源企业云盘Seafile并实现外部访问

    Seafile是一个开源、专业、可靠的云存储平台&#xff1b;解决文件集中存储、共享和跨平台访问等问题。这款软件功能强大&#xff0c;界面简洁、操作方便。 本文将详细的介绍如何利用本地主机部署 Seafile&#xff0c;并结合nat123&#xff0c;实现外网访问本地部署的 Seafile …...

    微前端 - Native Federation使用完整示例

    这是一个极简化的 Angular 使用angular-architects/native-federation 插件的微前端示例&#xff0c;只包含一个主应用和一个远程应用。 完整示例展示 项目结构 federation-simple/ ├── host-app/ # 主应用 └── remote-app/ # 远程应用 创建远程应用 (remote…...