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程序抓取网页的HTML信息的一个小实例
May 02 Python
Python中optparser库用法实例详解
Jan 26 Python
python合并同类型excel表格的方法
Apr 01 Python
Go/Python/Erlang编程语言对比分析及示例代码
Apr 23 Python
Python3爬虫之urllib携带cookie爬取网页的方法
Dec 28 Python
利用Python+阿里云实现DDNS动态域名解析的方法
Apr 01 Python
Python实现合并excel表格的方法分析
Apr 13 Python
Python如何合并多个字典或映射
Jul 24 Python
python下载的库包存放路径
Jul 27 Python
Java Unsafe类实现原理及测试代码
Sep 15 Python
Python中用xlwt制作表格实例讲解
Nov 05 Python
Python爬虫+Tkinter制作一个翻译软件的示例
Feb 20 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侧拉菜单 漂亮,可以向右或者向左展开,支持FF,IE
2009/10/15 PHP
php开发文档 会员收费1期
2012/08/14 PHP
php+highchats生成动态统计图
2014/05/21 PHP
PHP实现克鲁斯卡尔算法实例解析
2014/08/22 PHP
php堆排序实现原理与应用方法
2015/01/03 PHP
yii gridview实现时间段筛选功能
2017/08/15 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
jquery1.4 教程二 ajax方法的改进
2010/02/25 Javascript
JQuery 技巧和窍门整理(8个)
2010/04/22 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
JQuery设置文本框和密码框得到焦点时的样式
2013/08/30 Javascript
javascript数组快速打乱重排的方法
2014/01/02 Javascript
jQuery实现多按钮单击变色
2014/11/27 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
2017/01/16 Javascript
详解Angular-Cli中引用第三方库
2017/05/21 Javascript
vue中用H5实现文件上传的方法实例代码
2017/05/27 Javascript
详解Angular之constructor和ngOnInit差异及适用场景
2017/06/22 Javascript
springmvc接收jquery提交的数组数据代码分享
2017/10/28 jQuery
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
jQuery实现的简单对话框拖动功能示例
2018/06/05 jQuery
Vue表情输入组件 微信face表情组件
2019/02/11 Javascript
vue3.0中的双向数据绑定方法及优缺点
2019/08/01 Javascript
python条件和循环的使用方法
2013/11/01 Python
Numpy数组的保存与读取方法
2018/04/04 Python
Python 复平面绘图实例
2019/11/21 Python
python默认参数调用方法解析
2020/02/09 Python
豪华复古化妆:Besame Cosmetics
2019/09/06 全球购物
30年同学聚会邀请函
2014/01/25 职场文书
开工仪式策划方案
2014/05/23 职场文书
关于读书的演讲稿300字
2014/08/27 职场文书
授权委托书协议书
2014/10/16 职场文书
党的群众路线教育实践活动组织生活会发言材料
2014/10/17 职场文书
OpenCV-Python直方图均衡化实现图像去雾
2021/06/07 Python
java设计模式--七大原则详解
2021/07/21 Java/Android
JS中如何优雅的使用async await详解
2021/10/05 Javascript