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实现的一只从百度开始不断搜索的小爬虫
Aug 13 Python
Python二维码生成库qrcode安装和使用示例
Dec 16 Python
python实现用户登录系统
May 21 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
Jul 07 Python
对python中GUI,Label和Button的实例详解
Jun 27 Python
python 将日期戳(五位数时间)转换为标准时间
Jul 11 Python
使用OpenCV实现仿射变换—缩放功能
Aug 29 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
Feb 26 Python
python实现电子词典
Mar 03 Python
Python替换NumPy数组中大于某个值的所有元素实例
Jun 08 Python
Python爬虫爬取糗事百科段子实例分享
Jul 31 Python
Python Selenium XPath根据文本内容查找元素的方法
Dec 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
PHP新手上路(五)
2006/10/09 PHP
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
php 文件缓存函数
2011/10/08 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
2014/04/24 PHP
PHP中把对象数组转换成普通数组的方法
2015/07/10 PHP
PHP的serialize序列化数据以及JSON格式化数据分析
2015/10/10 PHP
php等比例缩放图片及剪切图片代码分享
2016/02/13 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
2016/04/07 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
2016/05/09 PHP
PHP页面间传递值和保持值的方法
2016/08/24 PHP
理解Javascript_14_函数形式参数与arguments
2010/10/20 Javascript
javascript自定义的addClass()方法
2014/05/28 Javascript
使用递归遍历对象获得value值的实现方法
2016/06/14 Javascript
js计算系统当前日期是星期几的方法
2016/07/14 Javascript
打造通用的匀速运动框架(实例讲解)
2017/10/17 Javascript
详解layui中的树形关于取值传值问题
2018/01/16 Javascript
小程序实现选择题选择效果
2018/11/04 Javascript
简单了解node npm cnpm的具体使用方法
2019/02/27 Javascript
js实现限定区域范围拖拉拽效果
2020/11/20 Javascript
[01:33:59]真人秀《加油 DOTA》 第六期
2014/09/09 DOTA
Python创建系统目录的方法
2015/03/11 Python
详解python中xlrd包的安装与处理Excel表格
2016/12/16 Python
Python切片索引用法示例
2018/05/15 Python
对Python闭包与延迟绑定的方法详解
2019/01/07 Python
python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例
2020/03/08 Python
Django+Uwsgi+Nginx如何实现生产环境部署
2020/07/31 Python
Baby Tulai澳大利亚:美国婴儿背带品牌
2018/10/15 全球购物
运动鞋、街头服装、手表和手袋的实时市场:StockX
2020/11/25 全球购物
中层竞聘演讲稿
2014/01/09 职场文书
丑小鸭教学反思
2014/02/03 职场文书
八项规定对照检查材料
2014/08/31 职场文书
年度考核登记表个人总结
2015/03/06 职场文书
2016党性教育学习心得体会
2016/01/21 职场文书
java executor包参数处理功能 
2022/02/15 Java/Android
Nginx流量拷贝ngx_http_mirror_module模块使用方法详解
2022/04/07 Servers
Linux在两个服务器直接传文件的操作方法
2022/08/05 Servers