,这几天一直没怎么动。昨晚,我偶然发现了Python中的itchat包。完成了微信个人账号API接口。让爬取个人微信信息更方便。鉴于很久以前就想知道微信好友的性别比例来自哪个城市等问题,我决定一心一意爬上我的微信。首先,在终端中安装itchat包。pipinstallitchat安装完成后,导入包,然后登录你的微信。过程中会生成登录二维码,扫码即可登录。登录成功后,往下爬好友的相关信息。importitchatitchat.login()#抓取好友信息,返回一个json文件friends=itchat.get_friends(update=True)[0:]有了上面的好友数据,我们就可以做分析了。微信好友的男女比例仔细观察返回的数据结构,发现“性别”存储在一个字典中,key为“Sex”,男值为1,女值为2,其他为未知性别(无填充)。可以写个循环获取想要的性别数据,获取微信好友的性别比例。初始化计数器male=female=other=0#friends[0]是自己的信息,所以从friends[1]开始foriinfriends[1:]:sex=i["Sex"]ifsex==1:male+=1elifsex==2:female+=1else:other+=1#计算好友总数total=len(friends[1:])#打印出好友性别比例print("男友:%.2f%%"%(float(male)/total*100)+"\n"+"女性朋友:%.2f%%"%(float(female)/total*100)+"\n"+"未知性别朋友:%.2f%%"%(float(other)/total*100))打印出来的结果是:男性朋友:37.65%女性朋友:59.23%性别不明的朋友:3.12%啊,不小心暴露了我女性朋友多的事实。可为什么我现在还是一条狗?!好吧,我们用R把这个数据画成图看看(Python画图实在是受不了,所以代码就不放了):仔细观察我微信好友的城市分布好友列表,发现里面也包含数据好友昵称、省份、城市、个人简介等,可用于分析好友所在城市分布。最好的方法是定义一个函数来爬取所有数据并将它们保存在数据框中,然后分析。#定义一个函数来爬取每个变量defget_var(var):variable=[]foriinfriends:value=i[var]variable.append(value)returnvariable#调用函数获取每个变量并将数据保存到csv文件中,保存到桌面NickName=get_var("NickName")Sex=get_var('Sex')Province=get_var('Province')City=get_var('City')Signature=get_var('Signature')frompandasimportDataFramedata={'NickName':NickName,'Sex':Sex,'Province':Province,'City':City,'Signature':Signature}frame=DataFrame(data)frame.to_csv('data.csv',index=True)上面会得到一个csvdesktop文件叫data,用R打开,做一个简单的数据预处理,结果如下(隐私相关的已经预处理):然后把数据按照省市分组聚合,选出前20名,使用ggplot2包绘制如下城市分布图(代码太长,不放过,任性,需要参考的尽管问我):貌似大部分朋友都是在广东(不是废话吗?),广东的朋友大多集中在广州、深圳、珠海。第二名是奥克兰,其次是四川和澳门。灰色的NA值是指没有设置自己所在位置的好友,总共有70多个好友。另外由于微信在国外的设置问题(很多直接跳过省份,只能选择城市),很多国外的城市被误认为是省份。再来张图看看我的微信好友在广东的具体分布(取前八):我的微信好友个性签名自定义词云图很有意思。之前爬下了各位朋友的个性签名,就是为了分析一下大家个性签名中使用的高频词有哪些,顺便可以做一个词云图。先把爬下来的原始签名(Signature)打印出来,发现很多本来是表情,变成了emoji、span、class等无关紧要的词,需要先替换掉。另外,还有类似<>/=等符号,也需要用简单的正则表达式代替,然后全部拼起来得到文本字符串。importresiglist=[]foriinfriends:signature=i["Signature"].strip().replace("span","").replace("class","").replace("emoji","")rep=re.compile("1f\d+\w*|[<>/=]")signature=rep.sub("",signature)siglist.append(signature)text="".join(siglist)然后你可以把JB,啊不,把分词包弄成结巴分词。importjiebawordlist=jieba.cut(text,cut_all=True)word_space_split="".join(wordlist)终于可以进入绘图阶段了。大家可以根据自己想要的图片、形状、颜色绘制相似的图形(这里我用的是我的头像,当然是为了让颜色更鲜艳,让最终绘制出来的词云图更吸引人,更容易区分,我会先用PS对我的头像做一点处理)。为此,我们需要引入matplotlib、wordcloud、numpy、PIL等包。importmatplotlib.pyplotaspltfromwordcloudimportWordCloud,ImageColorGeneratorimportnumpyasnpimportPIL.ImageasImagecoloring=np.array(Image.open("/Users/apple/Desktop/wechat.jpg"))my_wordcloud=WordCloud(background_color="white",max_words=2000,mask=着色,max_font_size60,random_state=42,scale=2,font_path="/Library/Fonts/Microsoft/SimHei.ttf").generate(word_space_split)image_colors=ImageColorGenerator(coloring)plt.imshow(my_wordcloud.recolor(color_func=image_colors))plt。imshow(my_wordcloud)plt.axis("off")plt.show()运行上面的代码,得到如下图:貌似微信好友的个人签名里,有的人善于倾听,有的人强调善良,有的人关注灵魂,有的人关注生活。我一直在等待,从未放弃寻找。历经波折,不惧虚伪。诚心如一,不可辜负。一步一步,多一个梦想(我编不下去了)。最后,上面的内容是不是很有趣?它打开了新世界的大门吗?我的微信好友不多。如果我有几千个微信好友,我就可以获得几千条数据。还是很有分析价值的。当然itchat包还有很多其他的功能有待发掘,包括自动回复微信消息、自动添加好友、管理微信群等等,有空我们慢慢探索吧。
