微博评论爬虫 | 情感分析 | 词云图展示

本文介绍了一种针对微博评论的爬虫技术实现方案,并利用情感分析技术对爬取的数据进行了处理,最后生成了词云图以直观展示分析结果。

1. 数据获取部分

实验环境

Requests、json、io、sys、re、time、csv

数据获取目标

在这里插入图片描述

抓包

PC端和移动端分析

PC端抓包后,发现参数过多。
从移动端某博抓取url,发现加密参数较少方便入手
爬像新浪某博这样的大网站,不用想就知道不登录肯定是爬不了多少数据的(事实就是不登录的话只能爬第一页的评论数据)。
所以我们先抓取到cookie进行保存:
在这里插入图片描述

抓取到的目标链接

这里只提取了我想要爬取的四个目标url:

https://m.weibo.cn/1653196740/4595525837399095
https://m.weibo.cn/2027363802/4319350444018706
https://m.weibo.cn/2602644737/4638484377896654
https://m.weibo.cn/2337348632/4638209580207301

界面如下:
在这里插入图片描述

分析评论信息存储位置

首先自动加载评论数据时抓取ajax请求,发现response有unicode编码的数据,截图如下:
在这里插入图片描述

通过preview视图中发现,这些编码正式我们想要的评论数据,截图如下:
在这里插入图片描述
3. 那么如果获取自动加载的下一页的评论信息呢?抓取下一页的评论数据url分析
第一页的url为:
在这里插入图片描述

第二页的url为:
在这里插入图片描述

结果,请求中多了一个max_id和max_id_type

继续分析两者request和response发现:
第一页返回的json信息中包含的max_id和max_id_type正是下一页所需要的url参数。
在这里插入图片描述
接下来就可以开始我们的爬虫了。

爬虫结果

爬取结果如下,只爬了1W条左右:
在这里插入图片描述

2. 情感分析部分

数据准备

  1. BosonNLP_sentiment_score.txt 词语评分表
  2. degree.csv 程度副词表
  3. not.csv 否定词表
  4. stopword.txt 停用词表
    篇幅限制,读者可以自行百度这些表的含义
    在这里插入图片描述

主要代码

在这里插入图片描述
利用pandas,jieba来计算每条评论信息的分数,主要代码如上

效果

代码会生成两个文档:
在这里插入图片描述
一个是pos积极评论文档,一个是neg消极评论文档
neg文档如下:
(可以通过评论ID,找到原评论)
有部分误差,后期还可以通过调整评分阈值进行优化
在这里插入图片描述

pos文档如下:
在这里插入图片描述
这个基本是没什么误差的

3. 词云图部分

主要代码

在这里插入图片描述

效果

在这里插入图片描述

### Python 微博话题爬取、情感分析词云图实现 #### 数据获取与预处理 为了从微博平台抓取特定话题的相关数据,通常会采用网络爬虫技术。后端主要依赖于`requests`库来发送HTTP请求并接收响应内容[^2]。 ```python import requests def get_weibo_topic_data(topic, page=1): url = f"https://m.weibo.cn/api/container/getIndex?containerid={topic}&page={page}" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', } response = requests.get(url=url, headers=headers).json() return response['data'] ``` 此函数通过指定的话题ID(`containerid`)以及页码(`page`)向微博移动端接口发起GET请求,并解析JSON格式的结果以提取所需的数据结构[^4]。 #### 情感分析模块构建 对于所收集到的文字资料实施情绪倾向度评估是一项重要环节,在这里选用`snownlp`作为工具来进行中文文本的情感分类工作[^3]。 ```python from snownlp import SnowNLP def analyze_sentiment(text): s = SnowNLP(text) sentiment_score = s.sentiments if sentiment_score >= 0.7: return "Positive" elif sentiment_score <= 0.3: return "Negative" else: return "Neutral" ``` 上述代码片段定义了一个简单的函数用于计算输入字符串的情绪得分,并依据阈值判断其属于正面、负面还是中立态度之一[^1]。 #### 构建频统计模型 利用`jieba`分器对每条评论进行切割操作之后再借助`collections.Counter`对象记录各语出现次数从而形成频率表;最后挑选出前若干高频汇绘制成为视觉化的图形展示给用户观看。 ```python import jieba.analyse from collections import Counter def generate_wordcloud(comments): words_list = [] for comment in comments: seg_result = jieba.cut(comment) filtered_words = filter(lambda w: len(w)>1 and not w.isdigit(), seg_result) words_list.extend(list(filtered_words)) word_counts = dict(Counter(words_list).most_common()) return word_counts ``` 这段程序实现了将一组评论转化为适合制作成词云图表的形式——即字典形式存储着不同条及其对应的计数值。 #### 结合Flask框架搭建Web应用界面 为了让整个过程更加直观易懂,可以考虑运用轻量级的Web服务器如Flask创建在线服务平台供访问者交互式体验完整的流程:从提交查询条件直至最终看到生成后的图像文件为止。 ```python from flask import Flask, render_template_string, request app = Flask(__name__) @app.route('/') def index(): template = ''' <!DOCTYPE html> <html lang="en"> <!-- HTML模板省略 --> </html>''' topic = request.args.get('topic') if topic is None or topic.strip() == '': return render_template_string(template) data = get_weibo_topic_data(topic) sentiments = [analyze_sentiment(item["text"]) for item in data] word_cloud = generate_wordcloud([item["text"] for item in data]) # 这里假设已经有一个保存图片的方法save_image(word_cloud), 并返回路径path_to_img path_to_img = save_image(word_cloud) rendered_html = render_template_string( template, img_url=path_to_img, results=sentiments ) return rendered_html ``` 该部分展示了如何设置路由规则使得当接收到带有参数`topic`的GET请求时能够调用之前编写的各个功能组件完成全部任务链路的操作。
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lijiamingccc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值