此小项目参考《微信好友数据分析 》——余本国
一、功能介绍:
本文主要介绍利用网页端微信获取数据,实现个人微信好友数据的获取,并
进行一些简单的数据分析,功能包括:
1.爬取好友列表,显示好友昵称、性别和地域和签名, 文件保存为 xlsx 格式
2.统计好友的地域分布,并且做成词云和可视化展示在地图上
二、运行环境及相关库的安装
- Python 3.x(使用Anaconda的spyder编辑器)
- 使用到的Python库安装:
- 在Anaconda的Anaconda Prompt下运行下列命令,安装前先升级pip,代码如下:
Python -m pip install --upgrade pip
- 安装 wxpy: pip install wxpy
-
安装 PIL: pip install pillow
-
安装 pyecharts:pip install pyecharts
-
安装 Itchat: pip install itchat
-
安装 Jieba: pip install jieba
-
安装 Pandas:pip install Pandas
- 安装 Numpy:pip install Numpy
- 安装 wordcloud:pip install wordcloud
- 安装地图数据包:pip install echarts-china-provinces-pypkg
- pip install echarts-countries-pypkg
代码如下
# -*- coding: utf-8 -*- """ Created on Wed Jun 5 11:44:42 2019 @author: lenovo """ 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=[] 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+\'.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\'C:\Users\lenovo\AppData\Local\Programs\Python\Python37\' save_wordcloud_to_html(save_road,file_name) shou_data_in_countrymap(save_road,file_name) main()
效果: