python微信好友数据分析详解


Posted in Python onNovember 19, 2018

基于微信开放的个人号接口python库itchat,实现对微信好友的获取,并对省份、性别、微信签名做数据分析。

效果:

python微信好友数据分析详解

python微信好友数据分析详解

python微信好友数据分析详解

直接上代码,建三个空文本文件stopwords.txt,newdit.txt、unionWords.txt,下载字体simhei.ttf或删除字体要求的代码,就可以直接运行。

#wxfriends.py 2018-07-09
import itchat
import sys
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']#绘图时可以显示中文
plt.rcParams['axes.unicode_minus']=False#绘图时可以显示中文
import jieba
import jieba.posseg as pseg
from scipy.misc import imread
from wordcloud import WordCloud
from os import path
#解决编码问题
non_bmp_map = dict.fromkeys(range(0x10000, sys.maxunicode + 1), 0xfffd)
 
 
#获取好友信息
def getFriends():
 friends = itchat.get_friends(update=True)[0:]
 flists = []
 for i in friends:
  fdict={}
  fdict['NickName']=i['NickName'].translate(non_bmp_map)
  if i['Sex'] == 1:
   fdict['Sex']='男'
  elif i['Sex'] == 2:
   fdict['Sex']='女'
  else:
   fdict['Sex']='雌雄同体'
  if i['Province'] == '':
   fdict['Province'] ='未知'
  else:
   fdict['Province']=i['Province']
  fdict['City']=i['City']
  fdict['Signature']=i['Signature']
  flists.append(fdict)
 return flists
 
 
#将好友信息保存成CSV
def saveCSV(lists):
 df = pd.DataFrame(lists)
 try:
  df.to_csv("wxfriends.csv",index = True,encoding='gb18030')
 except Exception as ret:
  print(ret)
 return df
 
 
#统计性别、省份字段 
def anysys(df):
 df_sex = pd.DataFrame(df['Sex'].value_counts())
 df_province = pd.DataFrame(df['Province'].value_counts()[:15])
 df_signature = pd.DataFrame(df['Signature'])
 return df_sex,df_province,df_signature
 
 
#绘制柱状图,并保存 
def draw_chart(df_list,x_feature):
 try:
  x = list(df_list.index)
  ylist = df_list.values
  y = []
  for i in ylist :
   for j in i:
    y.append(j)
  plt.bar(x,y,label=x_feature)
  plt.legend()
  plt.savefig(x_feature)
  plt.close()
 except:
  print("绘图失败")
 
 
#解析取个性签名构成列表  
def getSignList(signature):
 sig_list = []
 for i in signature.values:
  for j in i:
   sig_list.append(j.translate(non_bmp_map))
 return sig_list
 
 
#分词处理,并根据需要填写停用词、自定义词、合并词替换
def segmentWords(txtlist):
 stop_words = set(line.strip() for line in open('stopwords.txt', encoding='utf-8'))
 newslist = []
 #新增自定义词
 jieba.load_userdict("newdit.txt")
 for subject in txtlist:
  if subject.isspace():
   continue
  word_list = pseg.cut(subject)
  
  for word, flag in word_list:
   if not word in stop_words and flag == 'n' or flag == 'eng' and word !='span' and word !='class':
    newslist.append(word)
  #合并指定的相似词
 for line in open('unionWords.txt', encoding='utf-8'):
  newline = line.encode('utf-8').decode('utf-8-sig') #解决\ufeff问题
  unionlist = newline.split("*")
  for j in range(1,len(unionlist)):
   #wordDict[unionlist[0]] += wordDict.pop(unionlist[j],0)
   for index,value in enumerate(newslist):
    if value == unionlist[j]:
     newslist[index] = unionlist[0] 
 return newslist
 
 
#高频词统计
def countWords(newslist):
 wordDict = {}
 for item in newslist:
  wordDict[item] = wordDict.get(item,0) + 1
 itemList = list(wordDict.items())
 itemList.sort(key=lambda x:x[1],reverse=True)  
 for i in range(100):
  word, count = itemList[i]
  print("{}:{}".format(word,count))
 
 
#绘制词云
def drawPlant(newslist):
 d = path.dirname(__file__)
 mask_image = imread(path.join(d, "timg.png"))
 content = ' '.join(newslist)
 wordcloud = WordCloud(font_path='simhei.ttf', background_color="white",width=1300,height=620, max_words=200).generate(content) #mask=mask_image,
 # Display the generated image:
 plt.imshow(wordcloud)
 plt.axis("off")
 wordcloud.to_file('wordcloud.jpg')
 plt.show()
 
 
def main():
 #登陆微信
 itchat.auto_login() # 登陆后不需要扫码 hotReload=True
 flists = getFriends()
 fdf = saveCSV(flists)
 df_sex,df_province,df_signature = anysys(fdf)
 draw_chart(df_sex,"性别")
 draw_chart(df_province,"省份")
 wordList = segmentWords(getSignList(df_signature))
 countWords(wordList)
 drawPlant(wordList)
 
main()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Swift中的协议(protocol)学习教程
Jul 08 Python
ubuntu中配置pyqt4环境教程
Dec 27 Python
Python中顺序表的实现简单代码分享
Jan 09 Python
python学生管理系统代码实现
Apr 05 Python
python基于物品协同过滤算法实现代码
May 31 Python
Python设计模式之迭代器模式原理与用法实例分析
Jan 10 Python
使用Python实现将list中的每一项的首字母大写
Jun 11 Python
Centos7 下安装最新的python3.8
Oct 28 Python
解决pycharm下pyuic工具使用的问题
Apr 08 Python
Scrapy中如何向Spider传入参数的方法实现
Sep 28 Python
python 实现表情识别
Nov 21 Python
Python编程super应用场景及示例解析
Oct 05 Python
python生成九宫格图片
Nov 19 #Python
python实现简易动态时钟
Nov 19 #Python
python使用Turtle库绘制动态钟表
Nov 19 #Python
python+PyQT实现系统桌面时钟
Jun 16 #Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
Nov 18 #Python
Window环境下Scrapy开发环境搭建
Nov 18 #Python
Python中安装easy_install的方法
Nov 18 #Python
You might like
PHP实现克鲁斯卡尔算法实例解析
2014/08/22 PHP
yii2 开发api接口时优雅的处理全局异常的方法
2019/05/14 PHP
jquery 定位input元素的几种方法小结
2013/07/28 Javascript
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
莱鸟介绍window.print()方法
2016/01/06 Javascript
深入浅析JavaScript的API设计原则
2016/06/14 Javascript
JS构造函数与原型prototype的区别介绍
2016/07/04 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
2016/11/22 Javascript
JS实现的样式切换功能tableCSS实例
2016/12/30 Javascript
利用Query+bootstrap和js两种方式实现日期选择器
2017/01/10 Javascript
js实现tab选项卡切换功能
2017/01/13 Javascript
从零学习node.js之搭建http服务器(二)
2017/02/21 Javascript
layer弹出层取消遮罩的方法
2019/09/25 Javascript
Vue切换div显示隐藏,多选,单选代码解析
2020/07/14 Javascript
[01:25]DOTA2超级联赛专访iG 将调整状态找回自己
2013/06/05 DOTA
[52:44]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第一场 6.3
2018/06/04 DOTA
用Python登录Gmail并发送Gmail邮件的教程
2015/04/17 Python
Python爬取qq music中的音乐url及批量下载
2017/03/23 Python
python实现梯度下降算法
2020/03/24 Python
Python数据可视化库seaborn的使用总结
2019/01/15 Python
利用python计算windows全盘文件md5值的脚本
2019/07/27 Python
Python 导入文件过程图解
2019/10/15 Python
python机器学习库xgboost的使用
2020/01/20 Python
python 画图 图例自由定义方式
2020/04/17 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
2020/12/15 Python
星空联盟C# .net笔试题
2014/12/05 面试题
应届毕业生的自我鉴定
2013/11/13 职场文书
影视动画专业个人的自我评价
2013/12/31 职场文书
仓库组长岗位职责
2014/01/29 职场文书
公司会计岗位职责
2014/02/13 职场文书
社区矫正工作方案
2014/06/04 职场文书
企业宣传口号
2014/06/12 职场文书
我心目中的好老师活动方案
2014/08/19 职场文书
清明祭英烈活动总结
2015/05/11 职场文书
Mysql Show Profile
2021/04/05 MySQL
使用golang编写一个并发工作队列
2021/05/08 Golang