一、使用到的库
① wxpy:初始化微信机器人
② openpyxl:保存微信好友数据为Excel表格
③ pyecharts:生成可视化的地图
④ wordcloud、matplotlib、jieba:生成词云图
二、开始分析
1、首先登录自己的微信
from wxpy import Bot
#初始化机器人,选择缓存模式(扫码)登录
bot = Bot(cache_path=True)
#获取我的所有微信好友信息
friend_all = bot.friends()
运行登录代码会自动弹出一个二维码页面,打开如下图 1, 用手机扫码同意后,进入微信并获取微信好友的相关信息。
print(friend_all[0].raw)#获取自己的全部信息
print(len(friend_all))#输出自己的微信好友人数
为了获取好友信息中需要的部分,我们对信息需要进行处理。从上面的获取信息全字段来看,我们获取的每位好友的信息都是一个字典,字典里只有’City’、‘Province’、‘Signature’、
‘NickName’、‘HeadImgUrl’、'Sex’是我们需要的。下面我们就对这几个 key 进行提取。
lis=[] #创建一个空列表
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)
将 lis 列表能够保存到 excel 中:
def lis2e07(filename,lis):
infoTitle = ['NickName', 'Sex', 'Province', 'City']
wb = openpyxl.Workbook()
sheet = wb.active
sheet.title = 'list2excel07'
for _ in range(len(infoTitle)):
sheet.cell(row=1, column=_+1, value=infoTitle[_])
file_name = filename +'.xlsx'
for i in range(len(lis)):
for j in range(len(infoTitle)):
sheet.cell(row=i+2, column=j+1, value=str(lis[i][j]))
wb.save(file_name)
lis2e07('C:\\Users\\DELL\\Desktop\\yubg2',lis)
运行结果:
对数据进行简单的分析:
Friends = bot.friends()
data = Friends.stats_text(total=True, sex=True,top_provinces=30, top_cities=500)
print(data)
结果:
将好友所在的城市用词云图显示:
import matplotlib.pyplot as plt
plt.ion()
df = read_excel('C:\\Users\\DELL\\Desktop\\yubg2.xlsx',sheet_name='list2excel07')
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()
结果如图
生成微信好友在广东省分布的城市图:
def creatcitymap():
CityList=[]
CityNum = []
for i in range(FriNum):
if lis[i][4] not in CityList:
CityList.append(lis[i][4])
CityNum.append(0)
for i in range(FriNum):
for j in range(len(CityList)):
if lis[i][4] == CityList[j]:
CityNum[j] += 1
for i in range(len(CityList)):
CityList[i] += '市'
map=Map(width=1000, height=1000)
map.add("", CityList, CityNum, maptype="广东", is_visualmap=True, visual_text_color='#000')
map.render('C:\\Users\\DELL\\Desktop\\citymap.html')
结果如图: