我那篇“程序员快顶不住了?鸿蒙不兼容安卓,App重写时代来临!”的文章,评论区也是火爆异常,竟然收到了1000多条留言。评论区直接成了小型论坛,大家对鸿蒙的看法可谓五花八门。原本我还想逐条回复,但这么多评论,靠人工逐条回复几乎不可能。
于是,我忍不住开始琢磨,能不能来个“情绪大分析”,系统化整理这些评论,看看到底是支持鸿蒙的多,还是质疑的声音更大。为了方便大家阅读和了解,我决定干脆做一个情绪分析程序,不仅可以自动抓取评论,还能分类成正面、中立、负面,直接给出结果!这样,大家也可以用它来分析一些热点话题的评论,随时掌握舆论动态。
为了便于查看大家的观点,我干脆做了个留言板来整理评论内容,但却发现。。。
欢迎点击原文来看我的留言板
好吧,我不卖关子了,这是我最后用程序分析出的结果,还是正面情绪的人赢了✌️,险胜0.9%。
网友情绪分布图
正、负能量数量占比图
我也从一开始的纯粹去好奇留言的内容,升级为了关注评论区到底有多少种观点,到底是拥护者多还是唱衰者多,于是一冲动暗自下了决定:做一个评论自动抓取与情绪分析。
接下来的几天,我就埋头苦干起来,打算去给这1000多条留言做一个观点分类和情绪分析,挖掘了一下数据背后的价值。
要去做观点分类和情绪分析,首先我得拿到数据,数据都在微信留言区,总不能一天天去复制记录,而且都是实时更新的,我也不能老盯着去看更新了什么,所以唯一的办法就是可以每隔一段时间就去拉取一次留言内容,做一次分析。这是个周期性的任务,相当于一个定时作业。说到这里,已经很明显了,这显然是一个计算机可以解决的问题。
如何自动化获取留言板的内容?
我去登录了公众号平台,找到了留言管理板块
这边显示400多条留言。
其实是1000多条留言,直接评论是400多条,而另外的600多条是基于评论的回复。
翻了下评论数,有差不多23页,所以看到这个数据量,也就已经排除了人工去一条条复制内容的做法。
第一个办法☝️
能想到的第一个比较简单的办法就是打开浏览器开发者模式,然后去获取页面元素信息。(这个做法需要有一定的网页开发基础,如html、css、javascript等编程知识)
- 首先打开开发者选项
- 然后定位到要获取的页面元素
然后就能看到页面上对应位置的html代码
- 分析网页元素之间的层级关系,能获取到评论的内容,而且会发现每个评论都是一个div区块包裹起来的。
- 但是会有一个问题,关于这个评论的回复是不能直接拿到的,一层层拨开div区块,也没有发现评论。
- 因为评论的回复没有展开导致网页元素还没有加载出来,我点击展开60条回复后,才能看到评论的回复被加载出来了
所以要看到所有评论和回复,我得一个个去点开,并且得一页页去翻,显然这不是最优解。网页直接获取的方式不行,接下来第二个办法就是通过网络协议来拿数据,通常来说,浏览器前后端之间的交互采用的都是http协议,所以通过分析http请求来拿服务端返回的数据理论上是可行的。
第二个办法☝️
- 依旧在开发者模式下,这次切换到网络(Network)选项卡,切换后,可以看到很多请求。
- 想要抓包到关于评论的请求,最快的方式就是先清空这里的请求。
清空请求后,面板里很清爽
- 然后点击评论,让页面局部重刷一次,这样新的请求中肯定会包含客户端向服务端请求评论数据。
- 然后我们去挨个看下每个请求的响应数据,很快就会找到一条包含很多响应数据的请求,展开看下,发现正是评论数据。
- 浏览器中看这个数据不方便,可以把数据复制到Sublime编辑器或者在线的json查看器中查看,转换成格式化后的Json数据,评论数据就一目了然了
- 统计下所有的评论条数,发现这种方式是可以取到所有评论的,说明这种方法可行,不用一页页去翻了。
- 接下来,仔细分析这个数据,会发现还是有问题,因为评论里的数据不包含回复数据,展开replyList这个字段,发现都是空的,查看多个评论中的replyList字段,都是一样的结果。
- 再次陷入分析,评论的回复数据大概率是在其他http请求中,清空网络选项卡(Network)下的所有请求,然后点击展开回复,发现进行了一次新请求,查看请求的响应数据,发现了评论的回复数据全在这里了。
也就说明每展开一次回复,就会有一次请求,那么400多个评论,假设每个评论都有回复,最多要请求400多次,这样数据就全了。
- 确定了具体的http请求后,我们就可以用postman工具来对url进行请求测试和分析了。
拉取微信评论的http url
经过测试,会发现评论的http请求,最多每次会拉取20条评论,虽然不方便,但是可以理解,这个是为了防止一下子数据拉取过多导致数据库处理超时和负载,所以通过begin和count来控制数据的拉取。
begin:代表从第几条数据开始取
count:代表取多少条数据(最多20条)
token:每一次登录公众号后台页面,这个值都不一样,但是每次只要登录会话有效,这个值就是不变的
comment_id:针对一篇公众号的所有评论都是同一个comment_id,这个值也是不变的
所以每次变化的参数就是begin和count,只要控制这两个。
- 再对回复的http请求url的参数进行分析。
拉取微信某个评论下所有回复的http url
很快可以得到几个关键参数:
tokenId和comment_id就不说了,跟上面一样。
limit:代表一个评论下的回复数量
max_reply_id:代表一个评论下下一个回复的序号
content_id:每个评论都有一个自己的content_id
11.用代码实现自动抓取
最后,我们就可以编写自动化数据拉取的程序,代码中的核心步骤就是对400多条评论进行迭代遍历,然后对取出每一条评论下面的所有回复。我用python代码把这个逻辑整理了下,代码篇幅有点多,我把核心的放出来供大家参考和提意见(后续阿灏会把这份代码开源哦,敬请关注+):
def parse():
#begin , count是为了支持分页查询
begin = 0
count = 20
comment_id = ‘3681928521628286981’
merge_list = []
while True:
comment_url = comment_url_format.format(begin,count,comment_id, token_id)
print(‘comment_url:’ + comment_url)
rx = random.choice([12, 4, 8, 10, 30])
r = requests.get(url=comment_url, headers=headers)
if r.status_code == 200:
print(‘ok response comment’)
# print(r.json())
parse_comments = json.loads(r.json()[‘comment_list’],strict=False)[‘comment’]
if len(parse_comments) == 0:
break
merge_list = merge_list + parse_comments
comments_count = len(parse_comments)
for i in range(0, comments_count):
reply = parse_comments[i][‘reply’]
new_reply = parse_comments[i][‘new_reply’]
if ‘reply_count’ in reply:
reply_count = reply[‘reply_count’]
max_reply_id = new_reply[‘max_reply_id’]
content_id = parse_comments[i][‘content_id’]
comment_id = parse_comments[i][‘comment_id’]
if reply_count == 0:
continue
reply_url = reply_url_format.format(comment_id,content_id,reply_count,max_reply_id,token_id)
print(‘reply_url: ‘ + reply_url)
r = requests.get(url=reply_url,headers=headers)
if r.status_code == 200:
print(‘ok response reply’)
# print(r.json())
reply_data = r.json()[‘reply_list’][‘reply_list’]
transformed_replies = [transform_reply(reply) for reply in reply_data]
# print(transformed_replies)
reply[‘reply_list’] = transformed_replies
# print(merge_list)
else:
print('wow, no response or error occurrd')
# stop rx seconds randomly for risk
print('stop ' + str(rx) + ' seconds')
time.sleep(rx)
begin += count
如何去做观点分类和情绪分析?
自动化的步骤完成了,通过代码,可以把所有的留言数据都拿出来,接下来我就可以偷偷懒了,可以利用目前流行的大模型去做数据分析和分类,语义级别的分析对大模型来说不是什么挑战,因此只要把数据丢进模型,我只要负责提需求即可,这样的大模型应用非常多,比如阿里的通义千问,百度的文心一言,当红小鲜肉kimi等等,都可以作为你分析的工具。
下面是我分析出来的结果是这样的:
网友情绪分布图
正、负能量数量占比图
最终结果显示:正面情绪险胜0.9%!哈哈,看得出来,大家对鸿蒙系统还是有一定支持的,尤其在国家支持自主研发的大背景下。
总结
通过这次分析,我不仅了解了大家对鸿蒙系统的情绪倾向,也展示了这个情绪分析程序的实际应用场景。你可以将它用在很多地方,比如分析论坛讨论的热点新闻、了解社交媒体上的舆论倾向,甚至可以帮你更好地了解自己产品的市场反馈。
后续阿灏会把这份代码开源哦,敬请关注+, 你会用这个工具来分析什么话题?留言告诉我!哈哈
声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/423580.html