python微信好友数据分析详解


Posted in Python onNovember 19, 2018

基于微信开放的个人号接口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中使用mongoengine操作MongoDB教程
Apr 24 Python
Django如何实现内容缓存示例详解
Sep 24 Python
Python用61行代码实现图片像素化的示例代码
Dec 10 Python
Python中的集合介绍
Jan 28 Python
Python @property使用方法解析
Sep 17 Python
Python 解决OPEN读文件报错 ,路径以及r的问题
Dec 19 Python
对tensorflow 中tile函数的使用详解
Feb 07 Python
Python使用ElementTree美化XML格式的操作
Mar 06 Python
利用python爬取有道词典的方法
Dec 08 Python
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
Apr 03 Python
Python中相见恨晚的技巧
Apr 13 Python
详解Python如何批量采集京东商品数据流程
Jan 22 Python
python生成九宫格图片
Nov 19 #Python
python实现简易动态时钟
Nov 19 #Python
python使用Turtle库绘制动态钟表
Nov 19 #Python
python+PyQT实现系统桌面时钟
Jun 16 #Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
Nov 18 #Python
Window环境下Scrapy开发环境搭建
Nov 18 #Python
Python中安装easy_install的方法
Nov 18 #Python
You might like
PHP中Date()时间日期函数的使用方法小结
2011/04/20 PHP
163的邮件用phpmailer发送(实例详解)
2013/06/24 PHP
php上传图片到指定位置路径保存到数据库的具体实现
2013/12/30 PHP
PHP关于htmlspecialchars、strip_tags、addslashes的解释
2014/07/04 PHP
php分页查询的简单实现代码
2017/03/14 PHP
php微信公众号开发之答题连闯三关
2018/10/20 PHP
PHP判断一个变量是否为整数、正整数的方法示例
2019/09/11 PHP
JS对HTML标签select的获取、添加、删除操作
2013/10/17 Javascript
jquery和ajax的关系详细介绍
2013/11/29 Javascript
JavaScript利用构造函数和原型的方式模拟C#类的功能
2014/03/06 Javascript
jQuery+css实现的蓝色水平二级导航菜单效果代码
2015/09/11 Javascript
文本框只能输入数字的实现方法(兼容IE火狐)
2016/06/25 Javascript
详解Vue-cli 创建的项目如何跨域请求
2017/05/18 Javascript
webpack 样式加载的实现原理
2018/06/12 Javascript
Electron-vue脚手架改造vue项目的方法
2018/10/22 Javascript
Angular事件之不同组件间传递数据的方法
2018/11/15 Javascript
[46:23]完美世界DOTA2联赛PWL S2 FTD vs Magma 第一场 11.20
2020/11/23 DOTA
Python中splitlines()方法的使用简介
2015/05/20 Python
python之文件的读写和文件目录以及文件夹的操作实现代码
2016/08/28 Python
python后端接收前端回传的文件方法
2019/01/02 Python
pyqt5 QProgressBar清空进度条的实例
2019/06/21 Python
Python爬虫抓取技术的一些经验
2019/07/12 Python
Python FtpLib模块应用操作详解
2019/12/12 Python
python实现异常信息堆栈输出到日志文件
2019/12/26 Python
python cookie反爬处理的实现
2020/11/01 Python
使用OpenCV校准鱼眼镜头的方法
2020/11/26 Python
香港最新科技与优质家居产品购物网站:J SELECT
2018/08/21 全球购物
捷克购买家具网站:JENA nábytek
2020/03/19 全球购物
SCHIESSER荷兰官方网站:德国内衣专家
2020/10/09 全球购物
群胜软件Java笔试题
2012/09/29 面试题
新闻专业个人自我评价
2013/09/21 职场文书
综合测评自我鉴定
2013/10/08 职场文书
安全生产检讨书
2014/01/21 职场文书
计划生育汇报材料
2014/12/26 职场文书
怎样写辞职信
2015/02/27 职场文书
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
2021/04/12 Python