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发送邮件示例(支持中文邮件标题)
Feb 16 Python
python用Pygal如何生成漂亮的SVG图像详解
Feb 10 Python
Python win32com 操作Exce的l简单方法(必看)
May 25 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
Aug 08 Python
在python中使用正则表达式查找可嵌套字符串组
Oct 24 Python
Python使用itchat 功能分析微信好友性别和位置
Aug 05 Python
Django项目创建到启动详解(最全最详细)
Sep 07 Python
Python变量作用域LEGB用法解析
Feb 04 Python
python字符串判断密码强弱
Mar 18 Python
python def 定义函数,调用函数方式
Jun 02 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
Jul 18 Python
python b站视频下载的五种版本
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
Yii中srbac权限扩展模块工作原理与用法分析
2016/07/14 PHP
thinkPHP自动验证、自动添加及表单错误问题分析
2016/10/17 PHP
浅谈php常用的7大框架的优缺点
2020/07/20 PHP
学习YUI.Ext 第四天--对话框Dialog的使用
2007/03/10 Javascript
javascript之水平横向滚动歌词同步的应用
2007/05/07 Javascript
Jquery实战_读书笔记1—选择jQuery
2010/01/22 Javascript
javascript倒计时功能实现代码
2012/06/07 Javascript
多种方法实现JS动态添加事件
2013/11/01 Javascript
textarea不能通过maxlength属性来限制字数的解决方法
2014/09/01 Javascript
JavaSacript中charCodeAt()方法的使用详解
2015/06/05 Javascript
快速掌握WordPress中加载JavaScript脚本的方法
2015/12/17 Javascript
简单了解JavaScript操作XPath的一些基本方法
2016/06/03 Javascript
JavaScript Ajax编程 应用篇
2016/07/02 Javascript
微信小程序后台解密用户数据实例详解
2017/06/28 Javascript
vue中axios处理http发送请求的示例(Post和get)
2017/10/13 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
Vue 图片压缩并上传至服务器功能
2020/01/15 Javascript
html-webpack-plugin修改页面的title的方法
2020/06/18 Javascript
[01:54]TI4西雅图DOTA2选手欢迎晚宴 现场报道
2014/07/08 DOTA
Python实现的金山快盘的签到程序
2013/01/17 Python
利用Python如何批量更新服务器文件
2018/07/29 Python
vim自动补全插件YouCompleteMe(YCM)安装过程解析
2019/10/21 Python
wxPython实现整点报时
2019/11/18 Python
python 比较2张图片的相似度的方法示例
2019/12/18 Python
使用matlab 判断两个矩阵是否相等的实例
2020/05/11 Python
Python必须了解的35个关键词
2020/07/16 Python
CSS3绘制不规则图形的一些方法示例
2015/11/07 HTML / CSS
大队委竞选演讲稿
2014/04/28 职场文书
司法局群众路线教育实践活动整改措施
2014/09/17 职场文书
助学金感谢信
2015/01/20 职场文书
2015年大学班级工作总结
2015/04/28 职场文书
二手房购房意向书
2015/05/09 职场文书
转学证明范本
2015/06/19 职场文书
PHP使用非对称加密算法RSA
2021/04/21 PHP
JavaScript如何利用Promise控制并发请求个数
2021/05/14 Javascript
《堡垒之夜》联动《刺客信条》 4月7日正式上线
2022/04/06 其他游戏