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 25 Python
十个Python程序员易犯的错误
Dec 15 Python
通过Python爬虫代理IP快速增加博客阅读量
Dec 14 Python
python3中set(集合)的语法总结分享
Mar 24 Python
python中如何使用朴素贝叶斯算法
Apr 06 Python
python os.path模块常用方法实例详解
Sep 16 Python
Python对象转换为json的方法步骤
Apr 25 Python
对Python强大的可变参数传递机制详解
Jun 13 Python
Python中pymysql 模块的使用详解
Aug 12 Python
keras导入weights方式
Jun 12 Python
paramiko使用tail实时获取服务器的日志输出详解
Dec 06 Python
python基础之类方法和静态方法
Oct 24 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五种设计模式小结
2011/03/23 PHP
php文件服务实现虚拟挂载其他目录示例
2014/04/17 PHP
PHP 接入微信扫码支付总结(总结篇)
2016/11/03 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
2019/11/13 PHP
JS cookie中文乱码解决方法
2014/01/28 Javascript
javascript获取元素偏移量的方法有哪些
2014/06/24 Javascript
IE中鼠标经过option触发mouseout的解决方法
2015/01/29 Javascript
JS实现仿中关村论坛评分后弹出提示效果的方法
2015/02/23 Javascript
JS判断字符串包含的方法
2015/05/05 Javascript
javascript实现自动填写表单实例简析
2015/12/02 Javascript
javascript产生随机数方法汇总
2016/01/25 Javascript
基于AGS JS开发自定义贴图图层
2017/03/31 Javascript
AngularJS使用ng-class动态增减class样式的方法示例
2017/05/18 Javascript
使用vue-cli3 创建vue项目并配置VS Code 自动代码格式化 vue语法高亮问题
2019/05/14 Javascript
layui自定义工具栏的方法
2019/09/19 Javascript
vue3.0 加载json的方法(非ajax)
2020/10/26 Javascript
Vant picker 多级联动操作
2020/11/02 Javascript
JavaScript实现表单验证功能
2020/12/09 Javascript
[02:08]2014DOTA2国际邀请赛 430专访:力争取得小组前二
2014/07/11 DOTA
Python OpenCV 直方图的计算与显示的方法示例
2018/02/08 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
2020/01/10 Python
Scrapy框架介绍之Puppeteer渲染的使用
2020/06/19 Python
python在地图上画比例的实例详解
2020/11/13 Python
Pycharm常用快捷键总结及配置方法
2020/11/14 Python
黑猩猩商店:The Chimp Store
2020/02/12 全球购物
JMS中Topic和Queue有什么区别
2013/05/15 面试题
abstract class和interface有什么区别
2013/08/04 面试题
班主任工作年限证明
2014/01/12 职场文书
食品安全工作方案
2014/05/07 职场文书
运动会入场口号
2014/06/07 职场文书
在宿舍喝酒的检讨书
2014/09/28 职场文书
乡镇党员群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
开展党的群众路线教育实践活动工作总结
2014/11/05 职场文书
五好家庭事迹材料
2014/12/20 职场文书
Redis之RedisTemplate配置方式(序列和反序列化)
2022/03/13 Redis
《仙剑客栈2》第一弹正式宣传片公开 年内发售
2022/04/07 其他游戏