Python实现微信好友的数据分析


Posted in Python onDecember 16, 2019

基于微信开放的个人号接口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 布尔操作实现代码
Mar 23 Python
Python里隐藏的“禅”
Jun 16 Python
使用grappelli为django admin后台添加模板
Nov 18 Python
python实现挑选出来100以内的质数
Mar 24 Python
使用Python标准库中的wave模块绘制乐谱的简单教程
Mar 30 Python
Python中的choice()方法使用详解
May 15 Python
各个系统下的Python解释器相关安装方法
Oct 12 Python
pandas数据处理基础之筛选指定行或者指定列的数据
May 03 Python
python列表,字典,元组简单用法示例
Jul 11 Python
解决Python3 抓取微信账单信息问题
Jul 19 Python
python实现差分隐私Laplace机制详解
Nov 25 Python
Python基础学习之奇异的GUI对话框
May 27 Python
Python字典中的值为列表或字典的构造实例
Dec 16 #Python
python groupby 函数 as_index详解
Dec 16 #Python
Python基本类型的连接组合和互相转换方式(13种)
Dec 16 #Python
Python实现word2Vec model过程解析
Dec 16 #Python
Python爬虫爬取煎蛋网图片代码实例
Dec 16 #Python
python实现监控阿里云账户余额功能
Dec 16 #Python
Python实现密码薄文件读写操作
Dec 16 #Python
You might like
php获取文件类型和文件信息的方法
2015/07/10 PHP
PHP简单实现正则匹配省市区的方法
2018/04/13 PHP
菜鸟javascript基础整理1
2010/12/06 Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
2013/12/24 Javascript
jquery easyui combox一些实用的小方法
2013/12/25 Javascript
谷歌地图打不开的解决办法
2014/08/07 Javascript
jQuery实现选中弹出窗口选择框内容后赋值给文本框的方法
2015/11/23 Javascript
Javascript BOM学习小结(六)
2015/11/26 Javascript
jquery实现列表上下移动功能
2016/02/25 Javascript
完美解决JS文件页面加载时的阻塞问题
2016/12/18 Javascript
nodejs和php实现图片访问实时处理
2017/01/05 NodeJs
原生JS 购物车及购物页面的cookie使用方法
2017/08/21 Javascript
vue中component组件的props使用详解
2017/09/04 Javascript
vue-router传递参数的几种方式实例详解
2018/11/13 Javascript
js实现通过开始结束控制的计时器
2019/02/25 Javascript
微信小程序批量监听输入框对按钮样式进行控制的实现代码
2019/10/12 Javascript
微信小程序button标签open-type属性原理解析
2020/01/21 Javascript
vue实现计算器功能
2020/02/22 Javascript
前端深入理解Typescript泛型概念
2020/03/09 Javascript
toString.call()通用的判断数据类型方法示例
2020/08/28 Javascript
利用H5api实现时钟的绘制(javascript)
2020/09/13 Javascript
在Python中操作文件之truncate()方法的使用教程
2015/05/25 Python
Python自动生产表情包
2017/03/17 Python
python实现转盘效果 python实现轮盘抽奖游戏
2019/01/22 Python
Python django框架开发发布会签到系统(web开发)
2020/02/12 Python
Python爬取豆瓣数据实现过程解析
2020/10/27 Python
澳大利亚领先的女帽及配饰公司:Morgan&Taylor
2019/12/01 全球购物
四种会话跟踪技术
2015/05/20 面试题
销售员个人求职的自我评价
2014/02/10 职场文书
铣床操作工岗位职责
2014/06/13 职场文书
村安全生产责任书
2014/08/25 职场文书
单位法人授权委托书范本
2014/10/09 职场文书
优秀党支部申报材料
2014/12/24 职场文书
银行求职信怎么写
2019/06/20 职场文书
浅谈redis整数集为什么不能降级
2021/07/25 Redis
python创建字典及相关管理操作
2022/04/13 Python