微信已成为我们生活中很常用的通信软件了,也正是因为微信的流行与火爆,那些爬虫大佬就禁不住要盘一盘微信了,哈哈😊,作为小白,只能向大神不断学习。本文就简单记录一下使用python来爬取微信好友的一些信息。
itchat 在开始之前呢,首先要先介绍一下itchat。itchat是一个开源的微信个人号接口,它包含了丰富的微信API接口,itchat让使用python调用微信从未如此简单,具体关于itchat文档大家查看itchat文档 。
本次使用itchat,完成了个人微信登陆、好友按男女比例统计并画出可视化图形、好友分布地区统计、好友标签统计,当然,除了这些基本功能,还有更强大、更好玩的新式玩法等你开发。
安装所需要的库 首先,除了配置python的基本环境外(相信你已经完成),还需要安装好一些使用库,itchat、pyecharts、jieba库,安装方法就是通用的pip install 库名 ,这里要注意的是,pyecharts最新版1.6与1.0之前的版本有很大的变动,因此,如果要按照本文方法进行操作时,需要指定其版本安装:
1 pip install pyecharts==0.1.9.4
当然你也可以使用最新版本,不过要先阅读下pyecharts的更新文档哦。 准备就绪后就开始进行代码编写吧。
微信登陆,好友信息获取 性别人数统计,可视化图形输出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 import itchatimport matplotlib.pyplot as pltimport pandas as pdfrom pyecharts import Map,Geoimport jiebaimport reitchat.login() friends = itchat.get_friends() def get_var (var) : variable = [] for i in friends: value = i[var] variable.append(value) return variable male = female = other = 0 for i in friends[1 :]: sex = i["Sex" ] if sex == 1 : male +=1 elif sex == 2 : female +=1 else : other += 1 total = len(friends[1 :]) a = float(male)/total*100 b = float(female)/total*100 c = float(other)/total*100 x=[a,b,c] label = ['male' ,'female' ,'other' ] plt.pie(x=x, labels= label, autopct='%3.1f%%' ,shadow=True , labeldistance=1.1 , startangle=90 ,pctdistance=0.6 ) plt.show()
效果图如下:
获取好友的所在地区省份信息 使用map方法统计标注地图。
1 2 3 4 5 6 7 8 9 10 11 12 Province = get_var('Province' ) data = pd.DataFrame({'prv' :Province,'nu' :1 }) data = data.loc[data['prv' ]!='' ,:] data = data.groupby(['prv' ]).sum().sort_values(by='nu' ) provice = data.index.tolist() values = data.values.tolist() map = Map("好友分布" ,'地区分布' ,width=1200 , height=600 ) map.add("" ,provice,values,visual_range=[0 ,50 ],maptype='china' ,is_visualma=True , visual_text_color='#000' ) map.show_config() map.render(path="C:/path/pyTest/mapfriends.html" )
运行小地图结果,会发现你的朋友遍布全国各地😄。
爬取好友的个性签名 利用jieba方法进行中文分词,并输出csv格式文档。这里要注意的是,在数据保存为CSV时,encoding要设置为utf_8_sig,才能正常在文档中显示,不然会出现乱码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 siglist = [] for i in friends: 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) wordlist = jieba.cut(text, cut_all=True ) word_space_split = "," .join(wordlist).split(',' ) ph=open("C:/Users/wang/Desktop/pyTest/tyc.txt" ,"rb" ) tyc=str(ph.read().decode('utf-8' )) ph.close() m=[] for i in word_space_split: if i not in tyc: m.append(i) da=pd.DataFrame({'ci' :m,'nu' :1 }) da=da.groupby(['ci' ]).sum().sort_values(by='nu' ,ascending=False ) da.to_csv('C:/Users/wang/Desktop/pyTest/qianming.csv' ,encoding="utf_8_sig" )
截取的表格数据:
一些小问题 在使用matplotlib库绘制图形时,运行时出现Qt平台不能打开的问题(如图),参考了一些大佬的建议,可能是环境变量的问题,可参照这篇博文 进行更改。