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 相关文章推荐
Flask SQLAlchemy一对一,一对多的使用方法实践
Feb 10 Python
跟老齐学Python之大话题小函数(2)
Oct 10 Python
python3生成随机数实例
Oct 20 Python
Python的类实例属性访问规则探讨
Jan 30 Python
在python 中split()使用多符号分割的例子
Jul 15 Python
Python数据处理篇之Sympy系列(五)---解方程
Oct 12 Python
python队列原理及实现方法示例
Nov 27 Python
关于python pycharm中输出的内容不全的解决办法
Jan 10 Python
使用python实现下载我们想听的歌曲,速度超快
Jul 09 Python
python接口自动化之ConfigParser配置文件的使用详解
Aug 03 Python
Python如何读写CSV文件
Aug 13 Python
Python Pandas 删除列操作
Mar 16 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下关于Cannot use a scalar value as an array的解决办法
2010/08/08 PHP
ThinkPHP空模块和空操作详解
2014/06/30 PHP
使用XHGui来测试PHP性能的教程
2015/07/03 PHP
WordPress中缩略图的使用以及相关技巧
2015/11/24 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
2019/10/17 PHP
Laravel5.5 动态切换多语言的操作方式
2019/10/25 PHP
NodeJS的模块写法入门(实例代码)
2012/03/07 NodeJs
eclipse如何忽略js文件报错(附图)
2013/10/30 Javascript
jquery文本框中的事件应用以输入邮箱为例
2014/05/06 Javascript
JQuery中的html()、text()、val()区别示例介绍
2014/09/01 Javascript
angularJS结合canvas画图例子
2015/02/09 Javascript
第四章之BootStrap表单与图片
2016/04/25 Javascript
jQuery Ajax 加载数据时异步显示加载动画
2016/08/01 Javascript
14 个折磨人的 JavaScript 面试题
2016/08/08 Javascript
各式各样的导航条效果css3结合jquery代码实现
2016/09/17 Javascript
详解JS几种变量交换方式以及性能分析对比
2016/11/25 Javascript
vue-loader教程介绍
2017/06/14 Javascript
详解Node.js一行命令上传本地文件到服务器
2019/04/22 Javascript
JavaScript JSON使用原理及注意事项
2020/07/30 Javascript
python中cPickle用法例子分享
2014/01/03 Python
Python获取Linux系统下的本机IP地址代码分享
2014/11/07 Python
Python爬虫爬验证码实现功能详解
2016/04/14 Python
python线程池(threadpool)模块使用笔记详解
2017/11/17 Python
Python 和 JS 有哪些相同之处
2017/11/23 Python
django文档学习之applications使用详解
2018/01/29 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
2018/10/29 Python
python字符串拼接+和join的区别详解
2020/12/03 Python
css3弹性盒模型实例介绍
2013/05/27 HTML / CSS
幼儿如何来做好自我评价
2013/11/05 职场文书
综合实践教学反思
2014/01/31 职场文书
电工工作职责范本
2014/02/22 职场文书
升学宴主持词
2014/04/02 职场文书
会计求职信
2014/05/29 职场文书
浅谈如何提高PHP代码的质量
2021/05/28 PHP
Python 数据可视化之Seaborn详解
2021/11/02 Python
css中:last-child不生效的解决方法
2022/08/05 HTML / CSS