微信好友分布分析

一.环境要求

Windows 10;python 3.7;

第三方库

wxpy 0.3.9.8——登录微信
openpyxl 2.6.2——可对 excel 表格进行操作

pyecharts 0.5.11——百度的开源可视化库,

wordcloud 1.5.0——词云制作库

matplotlib 3.1.0——生成词云图

pandas 0.24.2——读取 excel 表格的数据

pyecharts-snapshot 0.2.0——是 pyecharts 的依赖库之一

echarts-countries-pypkg——pyecharts 的世界地图包

echarts-china-provinces-pypkg——pyecharts 的中国省份地图包

 

第三方库的安装

(2019年6月10号)除了 pyecharts 其它都可以直接使用 pip 安装,而安装 pycharts 需要特殊些(因为最新版已出为 1.X版,不向下兼容),如下:
pip install wxpypip install openpyxlpip install PILpip install pandaspip install wordcloudpip install pyecharts==0.5.11pip install echarts-countries-pypkgpip install echarts-china-provinces-pypkgpip install pyecharts-snapshot

  

二.分析思路

 1.登录微信,获取好友的基本信息

使用 wxpy 的 Bot() 模块,登录微信

 

from wxpy import *bot = Bot(cache_path = True)#获取全部好友的信息friend_all = bot.friends()#输出 friend_all 看一下print(friend_all)

#输出好友数量
#print(len(friend_all))

 

输出结果为

技术图片

 

 

2.把好友信息存为更易处理的二维列表

 

#建立一个二维列表,存储基本好友信息lis = [[NickName,Sex,City,Province,Signature,HeadImgUrl,HeadImgFlag]]#把好有特征数据保存为列表for a_friend in friend_all: #遍历 friend_all, 并使用 raw.get(‘ ‘, None), 来获取每一各朋友的基本信息 NickName = a_friend.raw.get(NickName, None) Sex = {1:"", 2:"", 0:"其它"}.get(a_friend.raw.get(Sex, None), None) City = a_friend.raw.get(City, None) Province = a_friend.raw.get(Province, None) Signature = a_friend.raw.get(Signature, None) HeadImgUrl = a_friend.raw.get(HeadImgUrl, None) HeadImgFlag = a_friend.raw.get(HeadImgFlag, None) list_0 = [NickName, Sex, City, Province, Signature, HeadImgUrl, HeadImgFlag] lis.append(list_0)

 

输出 lis 

技术图片

 

3.把列表存为 excel 表格,方便本地查看

 

#把列表转换为 xlsx 表格def list_to_xlsx(filename, list): import openpyxl
  #新建一个表格 wb
= openpyxl.Workbook() sheet = wb.active sheet.title = Friends file_name = filename + .xlsx for i in range(0, len(list)): for j in range(0, len(list[i])): sheet.cell(row = i+1, column = j+1, value = str(list[i][j])) wb.save(file_name) print("读写数据成功")#把列表生成表格list_to_xlsx(wechat_friend, lis)

 生成的表格为

技术图片

 

4.对 execl 表格进行处理,利用表格信息生成词云

 

from wordcloud import WordCloudimport matplotlib.pyplot as pltimport pandas as pdfrom pandas import read_exceldf = read_excel(wechat_friend.xlsx)#使用 WordCloud 生成词云word_list = df[City].fillna(‘‘).tolist()new_text =  .join(word_list)wordcloud = WordCloud(font_path=msyh.ttc, background_color = white).generate(new_text)plt.imshow(wordcloud)plt.axis("off")plt.show()plt.savefig("WordCloud.png")print("保存词云图")

 

词云图展示

技术图片

5.利用表格信息生成网页词云图(即HTML)

 

#使用 pyecharts 生成词云from pyecharts import WordCloudcity_list = df[City].fillna(‘‘).tolist()count_city = pd.value_counts(city_list)name = count_city.index.tolist()value = count_city.tolist()wordcloud = WordCloud(width=1300,height=620)wordcloud.add("",name,value,word_size_range=[20,100])#wordcloud.show_config()#wordcloud.render(r‘D:\wc.html‘)wordcloud.render(wordcloud.html)print("网页词云图已生成")

 词云图展示

技术图片

 

6.利用表格信息生成好友地图分布图

 

#将好友展示在地图上 from pyecharts import Mapprovince_list = df[Province].fillna(‘‘).tolist()count_province = pd.value_counts(province_list)attr = count_province.index.tolist()value1 = count_province.tolist()map = Map("各省微信好友分布", width=1200,height=600)map.add("",attr, value1, maptype=china,is_visualmap=True,visualmap_text_color=#000,is_label_show=True)#map.show_config()map.render(map.html)print("map已生成")

 

微信好友分布图展示

技术图片

 

三.最后代码汇总

 把上面的代码,规范一下,可得——

# -*- coding: utf-8 -*-"""Created on Mon Jun 3 10:01:35 2019@author: haiwe"""#获取微信接口 from wxpy import *#把获取的微信好友信息存为列表 def wx_friend_information(friend_all): #先生成一个二维列表,用来储存好友信息  lis = [[NickName,Sex,City,Province,Signature,HeadImgUrl,HeadImgFlag]] #遍历 friend_all, 并使用 raw.get(‘ ‘, None), 来获取每一各朋友的基本信息  for a_friend in friend_all: NickName = a_friend.raw.get(NickName, None) Sex = {1:"", 2:"", 0:"其它"}.get(a_friend.raw.get(Sex, None), None) City = a_friend.raw.get(City, None) Province = a_friend.raw.get(Province, None) Signature = a_friend.raw.get(Signature, None) HeadImgUrl = a_friend.raw.get(HeadImgUrl, None) HeadImgFlag = a_friend.raw.get(HeadImgFlag, None) list_0 = [NickName, Sex, City, Province, Signature, HeadImgUrl, HeadImgFlag] lis.append(list_0) return lis#把列表转换为 xlsx 表格,并保存表格 def list_to_xlsx(filename, list): #使用 openpyxl 创建空表格  import openpyxl wb = openpyxl.Workbook() #获得当前正在显示的 sheet, 或 wb.get_active_sheet()  sheet = wb.active #表格的 sheet 页命名为 Friends  sheet.title = Friends # execl 文件命名 file_name = filename + .xlsx #遍历 excel 表格,并读入数据  for i in range(0, len(list)): for j in range(0, len(list[i])): #为什么 i+1,j+1 不懂  sheet.cell(row = i+1, column = j+1, value = str(list[i][j])) #保存表格  wb.save(file_name) print("读写数据成功") from wordcloud import WordCloudimport matplotlib.pyplot as pltimport pandas as pd#使用 pandas 的 read_excel 模块读取execl 表格from pandas import read_excel#import numpy as np#生成词云图 def create_wordcloud(df): #把 df(dataframe) 中城市那列中 为空的 替换为 空字符,并把替换后的城市列存在 city_list中 word_list = df[City].fillna(‘‘).tolist() #把 city_list 列表中的 各项 用空格隔开,并变为字符串  new_text =  .join(word_list) #设置词云图的字体为 ‘msyh.ttc‘, 背景为白色(默认为黑色),并用 generate() 生成词云图  wordcloud = WordCloud(font_path=msyh.ttc, background_color = white).generate(new_text) #展示生成的词云图  plt.imshow(wordcloud) #plt.axis("off") #plt.show() plt.savefig("WordCloud.png") print("保存词云图")#使用 pyecharts 生成词云 def create_wordcloud_html(df): #调用 pyecharts 中 wordcloud 模块 from pyecharts import WordCloud #把 df(dataframe) 中城市那列中 为空的 替换为 空字符,并把替换后的城市列存在 city_list中  city_list = df[City].fillna(‘‘).tolist() #使用 pandas.value_count() 返回 city_list 中各项和其对应的频数(两者一一对应),并存在 count_city 中  count_city = pd.value_counts(city_list) #把 count_city 中的项提取出来,并存在 name 中 name = count_city.index.tolist() #把 count_city 中的频数提取出来  value = count_city.tolist() #生成词云图  wordcloud = WordCloud(width=1300,height=620) #往词云图中添加信息,  wordcloud.add("",name,value,word_size_range=[20,100]) #输出词云图的配置  #wordcloud.show_config() #wordcloud.render(r‘D:\wc.html‘) #保存词云图  wordcloud.render(wordcloud.html) print("网页词云图已生成") #将好友展示在地图上def create_map(df): #使用 pyechart 的 Map 模块,生成网页词云图 from pyecharts import Map #把 df(dataframe) 中省份那列中 为空的 替换为 空字符,并把替换后的城市列存在 province_list中 province_list = df[Province].fillna(‘‘).tolist() #使用 pandas.value_count() 返回 province_list 中各项和其对应的频数(两者一一对应),并存在 count_province 中 count_province = pd.value_counts(province_list) #把 count_province 中的项提取出来,并存在 name 中 attr = count_province.index.tolist() #把 count_province 中的频数提取出来 value1 = count_province.tolist() #生成一个标题为 “ ”的空白 HTML  map = Map("各省微信好友分布", width=1200,height=600) #向空白 HTML 中添加 信息,设置地图为 中国地图,并显示地图,设置地图上文字颜色,并显示标签 map.add("",attr, value1, maptype=china,is_visualmap=True,visualmap_text_color=#000,is_label_show=True) #map.show_config() #保存词云网页  map.render(map.html) print("map已生成") if __name__ == "__main__": #获取登录二维码 bot = Bot(cache_path = True) #获取微信朋友的基本数据 friend_all = bot.friends() list = wx_friend_information(friend_all) list_to_xlsx(wechat_friend, list) df = read_excel(wechat_friend.xlsx) create_wordcloud(df) create_wordcloud_html(df) create_map(df)

 

相关文章