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 相关文章推荐
天翼开放平台免费短信验证码接口使用实例
Dec 18 Python
Python heapq使用详解及实例代码
Jan 25 Python
Python编程之变量赋值操作实例分析
Jul 24 Python
Python编程把二叉树打印成多行代码
Jan 04 Python
pandas全表查询定位某个值所在行列的方法
Apr 12 Python
python使用magic模块进行文件类型识别方法
Dec 08 Python
详解python selenium 爬取网易云音乐歌单名
Mar 28 Python
Python 虚拟空间的使用代码详解
Jun 10 Python
Python DataFrame一列拆成多列以及一行拆成多行
Aug 06 Python
Python 从subprocess运行的子进程中实时获取输出的例子
Aug 14 Python
Python Numpy 控制台完全输出ndarray的实现
Feb 19 Python
Python趣味实战之手把手教你实现举牌小人生成器
Jun 07 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
一个简易需要注册的留言版程序
2006/10/09 PHP
8个必备的PHP功能实例代码
2013/10/27 PHP
高质量PHP代码的50个实用技巧必备(下)
2016/01/22 PHP
php采集神器cURL使用方法详解
2016/02/19 PHP
Laravel 将数据表的数据导出,并生成seeds种子文件的方法
2019/10/09 PHP
精解window.setTimeout()&window.setInterval()使用方式与参数传递问题!
2007/11/23 Javascript
jQuery实现用户注册的表单验证示例
2013/08/28 Javascript
PHP abstract与interface之间的区别
2013/11/11 Javascript
js将字符串转成正则表达式的实现方法
2013/11/13 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
jquery组件WebUploader文件上传用法详解
2020/10/23 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
2017/01/21 Javascript
微信小程序商城项目之购物数量加减(3)
2017/04/17 Javascript
easyui combogrid实现本地模糊搜索过滤多列
2017/05/13 Javascript
JavaScript实现自动跳转文本功能
2017/05/25 Javascript
node.js学习之事件模块Events的使用示例
2017/09/28 Javascript
Electron-vue脚手架改造vue项目的方法
2018/10/22 Javascript
原生js+canvas实现验证码
2020/11/29 Javascript
jquery自定义组件实例详解
2020/12/31 jQuery
Python中用函数作为返回值和实现闭包的教程
2015/04/27 Python
Python之文字转图片方法
2018/05/10 Python
Python实现读取txt文件并转换为excel的方法示例
2018/05/17 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
Python实现的拉格朗日插值法示例
2019/01/08 Python
Python转换itertools.chain对象为数组的方法
2020/02/07 Python
python如何求圆的面积
2020/07/01 Python
HTML5 Canvas实现文本对齐的方法总结
2016/03/24 HTML / CSS
美国流行背包品牌:JanSport(杰斯伯)
2018/03/02 全球购物
阿联酋航空丹麦官方网站:Emirates DK
2019/08/25 全球购物
SK-II神仙水美国官网:SK-II美国
2020/02/25 全球购物
explicit和implicit的含义
2012/11/15 面试题
自主招生自荐书
2013/11/29 职场文书
投诉信格式范文
2015/07/02 职场文书
话题作文之呼唤
2019/12/18 职场文书
浅谈Java实现分布式事务的三种方案
2021/06/11 Java/Android
SpringBoot中HttpSessionListener的简单使用方式
2022/03/17 Java/Android