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 相关文章推荐
Python内置函数Type()函数一个有趣的用法
Feb 18 Python
浅谈Python类里的__init__方法函数,Python类的构造函数
Dec 10 Python
详解如何在python中读写和存储matlab的数据文件(*.mat)
Feb 24 Python
python ipset管理 增删白名单的方法
Jan 14 Python
Django异步任务之Celery的基本使用
Mar 23 Python
简单易懂Pytorch实战实例VGG深度网络
Aug 27 Python
解决pandas展示数据输出时列名不能对齐的问题
Nov 18 Python
python利用datetime模块计算程序运行时间问题
Feb 20 Python
Python参数传递及收集机制原理解析
Jun 05 Python
利用python中的matplotlib打印混淆矩阵实例
Jun 16 Python
matplotlib画混淆矩阵与正确率曲线的实例代码
Jun 01 Python
python爬取网页版QQ空间,生成各类图表
Jun 02 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
2019十大人气国漫
2020/03/13 国漫
destoon数据库表说明汇总
2014/07/15 PHP
为你总结一些php系统类函数
2015/10/21 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
2018/04/21 PHP
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
Javascript 鼠标移动上去小三角形滑块缓慢跟随效果
2013/04/26 Javascript
javaScript arguments 对象使用介绍
2013/10/18 Javascript
javascript右下角弹层及自动隐藏(自己编写)
2013/11/20 Javascript
Jquery方式获取iframe页面中的 Dom元素
2014/05/07 Javascript
BootStrap 超链接变按钮的实现方法
2016/09/25 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
JS文件上传神器bootstrap fileinput详解
2021/01/28 Javascript
EasyUI Combobox设置默认值 获取text的方法
2016/11/28 Javascript
VueRouter导航守卫用法详解
2017/12/25 Javascript
vue实现打印功能的两种方法
2018/09/07 Javascript
node使用mysql获取数据库数据中文乱码问题的解决
2019/12/02 Javascript
[25:59]Newbee vs TNC 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python内置数据类型详解
2014/08/18 Python
python处理图片之PIL模块简单使用方法
2015/05/11 Python
Python实现SMTP发送邮件详细教程
2021/03/02 Python
Python批量查询域名是否被注册过
2017/06/21 Python
使用Python快速搭建HTTP服务和文件共享服务的实例讲解
2018/06/04 Python
python实现本地图片转存并重命名的示例代码
2018/10/27 Python
python实现狄克斯特拉算法
2019/01/17 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
Matplotlib自定义坐标轴刻度的实现示例
2020/06/18 Python
python实现计算图形面积
2021/02/22 Python
使用html2canvas实现浏览器截图的示例代码
2018/01/26 HTML / CSS
荷兰的时尚市场:To Be Dressed
2019/05/06 全球购物
法学专业个人求职信
2013/09/26 职场文书
捐款倡议书范文
2014/02/02 职场文书
学校庆元旦歌咏比赛主持词
2014/03/18 职场文书
个人委托书格式
2014/04/04 职场文书
村长党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
党的群众路线教育实践活动制度建设计划方案
2014/10/31 职场文书
初中生入团申请书范文(五篇)
2019/10/16 职场文书