使用 python 进行微信好友分析
一.环境要求
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 wxpy pip install openpyxl pip install PIL pip install pandas pip install wordcloud pip install pyecharts==0.5.11 pip install echarts-countries-pypkg pip install echarts-china-provinces-pypkg pip install pyecharts-snapshot
二.分析思路
1.登录微信,获取好友的基本信息
使用 wxpy 的 Bot() 模块,登录微信
In [3]: from wxpy import * #导入模块
In [4]: bot=Bot(cache_path=True)#初始化机器人,选择缓存模式(扫码)登录Getting uuid of QR code.
Downloading QR code.
Please scan the QR code to log in.
Please press confirm on your phone.
Loading the contact, this may take a little while.
Login successfully as 美好时光一定会来
Downloading QR code.
Please scan the QR code to log in.
Please press confirm on your phone.
Loading the contact, this may take a little while.
Login successfully as 美好时光一定会来
In [5]: friend_all=bot.friends()
In [6]: print(friend_all[0].raw)#friend_all[0]是你的微信昵称,.raw则是获取你的全部信息
2、统计用户信息
In [7]: len(friend_all) #统计查阅了多少好友 Out[7]: 155
1. 为了获取好友信息中需要的部分,我们对信息需要进行处理。从上面的获取信息全字段来看,我们获取的每位好友的信息都是一个字典,字典里只有'City'、'Province'、'Signature'、
'NickName'、'HeadImgUrl'、'Sex'是我们需要的。下面我们就对这几个 key 进行提取。方法是:对这几个 key 提取相应的值,放入一个列表 list_0 中,即每个好友的这些 key
的值做成了一个列表,在对所有的好友使用 for 循环进行同样的操作,将所有好友的列表做成一个大列表 lis 的元素,即列表中的元素是列表。
In[7]:lis=[] #lis=['nickname','sex','city','province','headImgUrl','headImgFlag'] In[8]:for a_friend in friend_all: NickName=a_friend.raw.get('NickName',None) #Sex=a_friend.raw.get('Sex',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)
2. 为了将 lis 列表能够保存到 excel 中,便于后面的使用,也便于此方法的再次使用,我们将这个功能写成函数 lis2e19(),即将这种列表套列表的 lis 转成 19 版的 exce 进行保存在本地。
def lis2e19(filename,lis): ''' 将列表写入 07 版 excel 中,其中列表中的元素是列表. filename:保存的文件名(含路径) lis:元素为列表的列表,如下: lis = [["名称", "价格", "出版社", "语言"], ["暗时间", "32.4", "人民邮电出版社", "中文"], ["拆掉思维里的墙", "26.7", "机械工业出版社", "中文"]] ''' import openpyxl wb = openpyxl.Workbook() sheet = wb.active sheet.title = 'list2excel19' file_name = filename for i in range(0, len(lis)): for j in range(0, len(lis[i])): sheet.cell(row=i+1, column=j+1, value=str(lis[i][j])) wb.save(file_name) print("写入数据成功!") lis2e19(r'D:xm_wechat)
3. 将列表信息存储到 excel 中,文件名为 wechat_02.xlsx。
lis2e19(r'D:xm_wechat)
打开文件(部分截图):
4. 对数据进行初略的认知分析。
#对数据进行初步探索 #方法一 #粗略获取好友的统计信息 data = friend_all.stats_text(total=True, sex=True,top_provinces=10, top_cities=100) from pandas import read_excel df=read_excel(r'C:\Users\Benny\Desktop\Python\Python练习\wechat_02.xlsx',sheetname='list2excel19') print(data)
部分数据截图如下:
5 对 city 列数据做成词云
方法一:利用 plt+wordcloud 方法
from wordcloud import WordCloud import matplotlib.pyplot as plt import pandas as pd from pandas import DataFrame word_list= df['city'].fillna('0').tolist()#将 dataframe 的列转化为 list,其中的 nan 用“0”替换 new_text = ' '.join(word_list) wordcloud = WordCloud(font_path='simhei.ttf', background_color="black").generate(new_text) plt.imshow(wordcloud) plt.axis("off") plt.show()
图片:
6 将好友可视化展示在地图上
#将这些个好友在全国地图上做分布 province_list = df['province'].fillna('NAN').tolist() #将 dataframe 的列转化为 list,其中的 nan 用“NAN”替换 count_province = pd.value_counts(province_list)#对 list 进行全频率统计 from pyecharts import Map value =count_province.tolist() attr =count_province.index.tolist() map=Map("各省微信好友分布", width=1200, height=600) map.add("", attr, value, maptype='china', is_visualmap=True, visual_text_color='#000', is_label_show = True) #显示地图上的省份 map.show_config() map.render(r'C:\Users\Benny\Desktop\Python\map3.html')
图片:
三 全部代码:
一、环境与库准备:
Anaconda Prompt下运行:
# -*- coding: utf-8 -*- """ Created on Wed Jun 5 12:52:28 2019 @author: ausa """ from wxpy import* import openpyxl import pandas as pd from wordcloud import WordCloud import matplotlib.pyplot as plt from pyecharts import Map def connect_in(): ''' 连接网页版微信并返回所有朋友信息 bot:初始化机器人并选择缓存模式(扫码)登录 friend_all:获取我所有微信好友信息 ''' bot=Bot(cache_path=True) friend_all=bot.friends() return friend_all def analyse_friends(friend_all,top_provinces=10,top_cities=100): Friends = friend_all data = Friends.stats_text(total=True, sex=True,top_provinces=30, top_cities=500) print(data) def get_column_title(): '''输入并列标题行 ls=[] 默认为无 ''' column_titles=['NickName','Sex','City','Province',\ 'Signature','HeadImgUrl','HeadImgFlag'] return colomn_titles def data_dict_to_list(friend_all): ''' data_ls:初值:设列表初值为包含列标题行列表的列表\ 遍历所有好友信息字典提取数据加入到数据列表,并返回此数据列表 list_0:一个微信好友的数据列表,包括'NickName','Sex','City','Province',\ 'Signature','HeadImgUrl','HeadImgFlag'. ''' data_lis=[['NickName','Sex','City','Province','Signature','HeadImgUrl',\ 'HeadImgFlag']] for a_friend in friend_all: NickName = a_friend.raw.get('NickName',None) #Sex = a_friend.raw.get('Sex',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] data_lis.append(list_0) return data_lis def data_lis_savein_excel(data_lis=[],filename='wechat_data',\ sheet_title='wechat1'): ''' 将列表写入 07 版 excel 中,其中列表中的元素是列表. filename:保存的文件名(含路径) lis:元素为列表的列表,如下: lis = [["名称", "价格", "出版社", "语言"], ["暗时间", "32.4", "人民邮电出版社", "中文"], ["拆掉思维里的墙", "26.7", "机械工业出版社", "中文"]] ''' wb = openpyxl.Workbook() sheet = wb.active sheet.title =sheet_title file_name = filename +'.xlsx' for i in range(0, len(data_lis)): for j in range(0, len(data_lis[i])): sheet.cell(row=i+1, column=j+1, value=str(data_lis[i][j])) wb.save(file_name) return file_name print("写入数据成功!") def count_sing(file_name,sheet_name='wechat1',column_name='NickName'): '''输出单个列的统计数据''' f=open(file_name,'rb') data=pd.read_excel(f,sheetname=sheet_name) print(column_name+'\t'+str(data[column_name].count())) print(data[column_name].describe()) f.close() def wordcloud_show(file_name,sheet_name='wechat1',column_name='City'): '''用 plt+wordcloud 方法得到词云图''' f=open(file_name,'rb') data=pd.read_excel(f,sheetname=sheet_name) word_list= data[column_name].fillna('0').tolist() #将 dataframe 的列转化为 list,其中的 nan 用“0”替换 new_text = ' '.join(word_list) wordcloud = WordCloud(font_path='simhei.ttf', \ background_color="black").generate(new_text) plt.imshow(wordcloud) plt.axis("off") plt.show() f.close() def save_wordcloud_to_html(save_road,file_name,sheet_name='wechat1',\ column_name='City'): '''利用 pyecharm 做词云并存为html文件''' f=open(file_name,'rb') data=pd.read_excel(f,sheetname=sheet_name) #count = df.city.value_counts() #对 dataframe 进行全频率统计,排除了 nan city_list = data[column_name].fillna('NAN').tolist() #将 dataframe 的列转化为 list,其中的 nan 用“NAN”替换 count_city = pd.value_counts(city_list)#对 list 进行全频率统计 from pyecharts import WordCloud 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(save_road+'wordcloud'+'.html') f.close() def shou_data_in_countrymap(save_road,file_name,sheet_name='wechat1',\ column_name='Province'): '''将这些个好友在全国地图上做分布''' f=open(file_name,'rb') data=pd.read_excel(f,sheetname=sheet_name) province_list = data[column_name].fillna('NAN').tolist() #将 dataframe 的列转化为 list,其中的 nan 用“NAN”替换 count_province = pd.value_counts(province_list)#对 list 进行全频率统计 value =count_province.tolist() attr =count_province.index.tolist() map=Map("各省微信好友分布", width=1200, height=600) map.add("", attr, value, maptype='china', is_visualmap=True, visual_text_color='#000', is_label_show = True) #显示地图上的省份 map.show_config() map.render(save_road+'map1'+'.html') f.close() def main(): friends_data=connect_in() data_ls=data_dict_to_list(friends_data) file_name=data_lis_savein_excel(data_ls) analyse_friends(friends_data) count_sing(file_name) wordcloud_show(file_name) save_road=r'D:\xm_wechat' save_wordcloud_to_html(save_road,file_name) shou_data_in_countrymap(save_road,file_name) main()
创建图灵机器人:
from wxpy import Bot,Tuling,embed,ensure_one bot = Bot() my_friend = ensure_one(bot.search('顾嘉伟')) #想和机器人聊天的好友的备注 tuling = Tuling(api_key='ee8fb3854a6d40c1a0e42f57d7ac0342') @bot.register(my_friend) # 使用图灵机器人自动与指定好友聊天 def reply_my_friend(msg): tuling.do_reply(msg) embed()