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 远程统计文件代码分享
May 14 Python
Python 判断 有向图 是否有环的实例讲解
Feb 01 Python
解决Mac安装scrapy失败的问题
Jun 13 Python
对pandas数据判断是否为NaN值的方法详解
Nov 06 Python
Python OS模块实例详解
Apr 15 Python
itchat-python搭建微信机器人(附示例)
Jun 11 Python
Python:合并两个numpy矩阵的实现
Dec 02 Python
Python数据可视化:饼状图的实例讲解
Dec 07 Python
用什么库写 Python 命令行程序(示例代码详解)
Feb 20 Python
Python中如何添加自定义模块
Jun 09 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
Feb 23 Python
Python turtle实现贪吃蛇游戏
Jun 18 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中的一个中文字符串截取函数
2007/02/14 PHP
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
php关键字仅替换一次的实现函数
2015/10/29 PHP
php 如何获取文件的后缀名
2016/06/05 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
2019/05/08 PHP
jquery中交替点击事件的实现代码
2014/02/14 Javascript
javascript实例--教你实现扑克牌洗牌功能
2014/05/15 Javascript
学习JavaScript设计模式之策略模式
2016/01/12 Javascript
浅谈js多维数组和hash数组定义和使用
2016/07/27 Javascript
浅谈jquery之on()绑定事件和off()解除绑定事件
2016/10/26 Javascript
EasyUi 打开对话框后控件赋值及赋值后不显示的问题解决办法
2017/01/19 Javascript
Node Puppeteer图像识别实现百度指数爬虫的示例
2018/02/22 Javascript
通过封装scroll.js 获取滚动条的值
2018/07/13 Javascript
微信小程序使用swiper组件实现类3D轮播图
2018/08/29 Javascript
vue首次赋值不触发watch的解决方法
2018/09/11 Javascript
利用jsonp解决js读取本地json跨域的问题
2018/12/11 Javascript
vue2.0结合Element-ui实战案例
2019/03/06 Javascript
JavaScript数组去重的几种方法
2019/04/07 Javascript
vue 中使用print.js导出pdf操作
2020/11/13 Javascript
[44:22]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第一场 11.01
2020/11/02 DOTA
使用python实现正则匹配检索远端FTP目录下的文件
2015/03/25 Python
win10 64bit下python NLTK安装教程
2018/09/19 Python
对python中类的继承与方法重写介绍
2019/01/20 Python
Python enumerate内置库用法解析
2020/02/24 Python
Django --Xadmin 判断登录者身份实例
2020/07/03 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
2020/11/29 Python
matplotlib交互式数据光标实现(mplcursors)
2021/01/13 Python
英国屋顶用品和材料超市:Roofing Supplies UK
2019/08/24 全球购物
商场主管竞聘书
2014/03/31 职场文书
十八大演讲稿
2014/05/22 职场文书
乡镇党员干部群众路线对照检查材料思想汇报
2014/09/28 职场文书
小学教师节活动总结
2015/03/20 职场文书
旗帜观后感
2015/06/08 职场文书
同步小康驻村工作简报
2015/07/20 职场文书
创业项目(超低成本创业项目)
2019/08/16 职场文书
Python基于百度API识别并提取图片中文字
2021/06/27 Python