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操作CouchDB数据库简单示例
Mar 10 Python
Python中title()方法的使用简介
May 20 Python
Scrapy抓取京东商品、豆瓣电影及代码分享
Nov 23 Python
django ajax json的实例代码
May 29 Python
python删除本地夹里重复文件的方法
Nov 19 Python
使用Python编写Prometheus监控的方法
Oct 15 Python
Pandas之groupby( )用法笔记小结
Jul 23 Python
python实现上传文件到linux指定目录的方法
Jan 03 Python
如何使用Python破解ZIP或RAR压缩文件密码
Jan 09 Python
在Django中预防CSRF攻击的操作
Mar 13 Python
详解非极大值抑制算法之Python实现
Jun 28 Python
python多线程方法详解
Jan 18 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/06/02 PHP
ThinkPHP访问不存在的模块跳转到404页面的方法
2014/06/19 PHP
PHP实现bitmap位图排序与求交集的方法
2016/07/28 PHP
php微信公众平台交互与接口详解
2016/11/28 PHP
Yii2框架实现登录、退出及自动登录功能的方法详解
2017/10/24 PHP
深入研究PHP中的preg_replace和代码执行
2018/08/15 PHP
原生JS实现加入收藏夹的代码
2013/10/24 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
2014/01/12 Javascript
JS实现判断碰撞的方法
2015/02/11 Javascript
js实现数组冒泡排序、快速排序原理
2016/03/08 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
微信小程序 选择器(时间,日期,地区)实例详解
2016/11/16 Javascript
Angular中$state.go页面跳转并传递参数的方法
2017/05/09 Javascript
Vue+axios实现统一接口管理的方法
2018/07/23 Javascript
深入浅析angular和vue还有jquery的区别
2018/08/13 jQuery
vue.js 图片上传并预览及图片更换功能的实现代码
2018/08/27 Javascript
小程序实现搜索框
2020/06/19 Javascript
微信小程序wxml列表渲染原理解析
2019/11/27 Javascript
vue 使用外部JS与调用原生API操作示例
2019/12/02 Javascript
python使用PIL模块实现给图片打水印的方法
2015/05/22 Python
Python删除空文件和空文件夹的方法
2015/07/14 Python
深入理解Python中命名空间的查找规则LEGB
2015/08/06 Python
Python解析json文件相关知识学习
2016/03/01 Python
对python添加模块路径的三种方法总结
2018/10/16 Python
PyQt5实现简单数据标注工具
2019/03/18 Python
方太官方网上商城:销售方太抽油烟机、燃气灶、消毒柜等
2017/01/17 全球购物
韩国流行时尚女装网站:Dintchina(中文)
2018/07/19 全球购物
Paradox London官方网站:英国新娘鞋婚礼鞋品牌
2019/08/29 全球购物
如何手工释放资源
2013/12/15 面试题
函授本科个人自我鉴定
2014/03/25 职场文书
《画》教学反思
2014/04/14 职场文书
2015年营销工作总结范文
2015/04/23 职场文书
无工作证明怎么写
2015/06/15 职场文书
技术转让协议书
2016/03/19 职场文书
golang fmt格式“占位符”的实例用法详解
2021/07/04 Golang
Python音乐爬虫完美绕过反爬
2021/08/30 Python