"IT有得聊”是机械工业出版社旗下IT专业资讯和服务平台,致力于帮助读者在广义的IT领域里,掌握更专业、实用的知识与技能,快速提升职场竞争力。
本文内容将通过一个具体实例讲解将朋友圈数据导出为JSON文件的方法,并介绍使用Python统计分析JSON数据的过程。
注:本文中涉及的实例文件为《Python数据分析从入门到精通》随书资源文件
0
1
将朋友圈数据导出到JSON文件
使用开源工具WeChatMomentExport导出微信朋友圈数据,WeChatMomentExport的源码地址和使用教程请参考https://github.com/Chion82/WeChatMomentExport
如图1所示。
图1.使用WeChatMomentExport导出数据
使用WeChatMomentExport可导出如下所示的分类信息,每一个分类信息都保存到对应的JSON文件中。
- 发朋友圈数量排名。
- 朋友圈点赞数排名。
- 被点赞数排名。
- 发评论数量排名。
- 朋友圈收到评论数量排名。
- 被无视概率排名(评论被回复数/写评论数,条件为 写评论数>=15)。
- 发投票/问卷调查类广告数排名。
0
2
统计处理JSON文件中的朋友圈数据?
使用WeChatMomentExport导出数据后,接着使用Python统计分析朋友圈的各类信息。实例文件wechat_moment_stat.py的功能是分别统计处理7个JSON文件中的数据,然后输出显示统计结果。文件wechat_moment_stat.py的具体实现流程如下所示。
通过函数get_user()获取每个朋友圈用户的详细信息,具体实现代码如下所示。
def get_user(user_name):
foruser_info in result:
ifuser_info['user'] == user_name:
returnuser_info
user_info= {
'user': user_name,
'moments': [],
'post_comments': [],
'replied_comments': [],
'received_comments': [],
'post_likes': 0,
'received_likes': 0,
'spam_counts': 0,
}
result.append(user_info)
returnuser_info
编写函数is_spam()提取朋友圈留言中的信息,具体实现代码如下所示。
def is_spam(moment_text):
投' in moment_text and '谢' in moment_text):
returnTrue
投票' in moment_text):
returnTrue
问卷' in moment_text):
returnTrue
填' in moment_text and '谢' in moment_text):
returnTrue
returnFalse
编写函数handle_moment()处理留言信息,具体实现代码如下所示。
defhandle_moment(moment):
排序处理7类信息,具体实现代码如下所示。
user_info= get_user(moment['author'])
user_info['moments'].append(moment)
user_info['received_likes']= user_info['received_likes'] + len(moment
['likes'])
user_info['received_comments'].extend(moment['comments'])
if(is_spam(moment['content'])):
user_info['spam_counts']= user_info['spam_counts'] + 1
forcomment_info in moment['comments']:
comment_user= get_user(comment_info['author'])
comment_user['post_comments'].append(comment_info)
if(comment_info['to_user'] != ''):
replied_user= get_user(comment_info['to_user'])
replied_user['replied_comments'].append(comment_info)
forlike_info in moment['likes']:
like_user= get_user(like_info)
like_user['post_likes']= like_user['post_likes'] + 1
for moment_info in origin_data:
handle_moment(moment_info)
f = open('user_output.json', 'w')
f.write(json.dumps(result))
f.close()
post_moment_rank = sorted(result, key=lambdauser_info: len(user_info
['moments']), reverse=True)
post_like_rank = sorted(result, key=lambda user_info:user_info['post_
likes'], reverse= True)
received_like_rank = sorted(result, key=lambdauser_info: user_info
['received_likes'], reverse=True)
post_comment_rank = sorted(result, key=lambdauser_info: len(user_info
['post_comments']), reverse=True)
received_comment_rank = sorted(result, key=lambdauser_info: len(user_info
['received_ comments']), reverse=True)
no_reply_rank = sorted(result, key=lambdauser_info: ((float(len(user_
info['replied_comments']))/len(user_info['post_comments'])) if len(user_info
['post_comments'])>0 else 999))
spam_rank = sorted(result, key=lambda user_info:user_info['spam_counts'],
reverse=True)
f = open('post_moment_rank.json', 'w')
f.write(json.dumps(post_moment_rank))
f.close()
打印输出发送朋友圈信息最多的前5位数据,具体实现代码如下所示。
print('前5位点赞数量最多:')
temp_list = []
for i in range(5):
赞)' % post_like_
rank[i]['post_likes'])
print(', '.join(temp_list))
f = open('received_like_rank.json', 'w')
f.write(json.dumps(received_like_rank))
f.close()
打印输出前5位获得最多赞的用户信息,具体实现代码如下所示。
print('前5位获得最多赞:')
temp_list = []
for i in range(5):
赞)' % received_
like_rank[i] ['received_likes'])
print(', '.join(temp_list))
f = open('post_comment_rank.json', 'w')
f.write(json.dumps(post_comment_rank))
f.close()
打印输出前5位评论数量最多的用户信息,具体实现代码如下所示。
print('前5位评论数量最多:')
temp_list = []
for i in range(5):
评论)' % len(post_
comment_rank[i]['post_comments']))
print(', '.join(temp_list))
f = open('received_comment_rank.json', 'w')
f.write(json.dumps(received_comment_rank))
f.close()
打印输出前5位朋友圈评论最多的用户信息,具体实现代码如下所示。
print('前5位朋友圈评论最多:')
temp_list = []
for i in range(5):
评论)' % len
(post_comment_rank[i]['received_comments']))
print(', '.join(temp_list))
f = open('no_reply_rank.json', 'w')
f.write(json.dumps(no_reply_rank))
f.close()
f = open('spam_rank.json', 'w')
f.write(json.dumps(spam_rank))
f.close()
打印输出收到评论回复数/写评论数前5名且发出评论数>=15用户的信息,具体实现代码如下所示。
print('================================')
print('前5名(收到评论回复数/写评论数且 发出评论数>=15):')
temp_list = []
for user_info in no_reply_rank:
iflen(user_info['post_comments']) < 15:
continue
if (len(temp_list) > 5):
break
收到评论回复%d, 写评论%d)' % (len
(user_info['replied_comments']), len(user_info['post_comments']))))
print(', '.join(temp_list))
执行后打印输出朋友圈的统计结果如下所示。
前5位发最多朋友圈:
Joe(69 条), xxx (62 条), 嬴子夜。(58 条), xxx(46 条), psh(40 条)
前5位点赞数量最多:
Saruman(33 赞), xxx(28赞),ChiaChia.Ý(27赞),❄️Max❄(27 赞), 郭含阳(23赞)
前5位获得最多赞:
陈思君(38 赞), 404(32 赞), (29 赞), Justin Tan(27 赞), 杨宗炜 (26 赞)
前5位评论数量最多:
杨宗炜 (110 评论), 404(95 评论), Saruman(94 评论), MATTHEW °Д°(77 评论), Joe(57 评论)
前5位朋友圈评论最多:
杨宗炜 (209 评论), 404(130 评论), Joe(37 评论), MATTHEW °Д°(68 评论), ❄️Max❄(69 评论)
================================
收到评论回复数/写评论数且 发出评论数>=15:
Joe(收到评论回复13, 写评论57), jjy(收到评论回复4, 写评论16), Saruman(收到评论回复30, 写评论94), 玺玺玺(收到评论回复7, 写评论21), ChiaChia.Ý(收到评论回复6, 写评论15), 郭含阳(收到评论回复14, 写评论33)