python itchat_Python使用itchat获取微信好友

最近发现了一个好玩的包itchat,通过调用微信网页版的接口实现收发消息,获取好友信息等一些功能,各位可以移步itchat项目介绍查看详细信息。

目标:获取好友列表

统计性别及城市分布

根据好友签名生成词云

获取好友信息前文说了,itchat其实是调用微信网页版的接口,所以登陆的时候会弹出二维码进行登陆,然后通过itchat.get_friends获取好友信息就好了,相当简单。# -*- coding: utf-8 -*-import itchatimport pandas as pdimport seaborn as snsimport matplotlib.pyplot as pltimport warningsimport jiebaimport refrom scipy.misc import imread

from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator

itchat.login()#登陆网页版微信,需要手机扫码确认warnings.filterwarnings("ignore")获取好友信息的时候需要注意一点,因为好友列表中第一位是自己,所以从第二位开始保存。friends = itchat.get_friends(update=True)for counter,content in enumerate(friends[1:]):    if counter == 0:

df=pd.DataFrame(content)

df.columns=content.keys()    else:

df.loc[counter]=content.values()print '获取到%d位好友信息'%counter

df.columns字段信息如下:Index([u'UserName', u'City', u'DisplayName', u'UniFriend', u'MemberList',       u'PYQuanPin', u'RemarkPYInitial', u'Sex', u'AppAccountFlag',       u'VerifyFlag', u'Province', u'KeyWord', u'RemarkName', u'PYInitial',       u'IsOwner', u'ChatRoomId', u'HideInputBarFlag', u'EncryChatRoomId',       u'AttrStatus', u'SnsFlag', u'MemberCount', u'OwnerUin', u'Alias',       u'Signature', u'ContactFlag', u'NickName', u'RemarkPYQuanPin',       u'HeadImgUrl', u'Uin', u'StarFriend', u'Statues'],

dtype='object')

好友城市分布因为微信中位置信息是两级,省份和城市,对于北京上海这种直辖市,City字段中保存的是区的信息,这个部分做了下处理改为相应的城市名。df['City'][df['Province']==u'北京']= u'北京'df['City'][df['Province']==u'上海']= u'上海'df['City'][df['Province']==u'重庆']= u'重庆'#微信对于直辖市将city字段填写为区plt.figure(figsize = (15,12))

data_temp = df[df['City']!='']#剔除城市未填写的记录data_temp = data_temp.groupby(['City'])['UserName'].count().reset_index()

data_temp = data_temp.nlargest(15,'UserName')

data_temp.columns = ['City','Count']

sns.barplot(data=data_temp ,y='City',x='Count')for y,x in enumerate(data_temp['Count']):

plt.text(x,y,x,fontsize = 20)

plt.title(u'好友城市分布',fontsize =25)

plt.show()只取了前15位,效果如下:

性别分布Sex字段中有0,1,2三个值,分别代表性别不明,男,女,相应的replace一下就好。df['Sex'] = df['Sex'].replace({0:u'性别不明',1:u'男',2:u'女'})

plt.figure(figsize = (15,8))

plt.subplot(1,2,1)

data_temp = df.groupby(['Sex'])['UserName'].count().reset_index()

data_temp = data_temp.sort_values('UserName')

data_temp.columns = ['Sex','Count']

sns.barplot(data=data_temp ,x='Sex',y='Count')for x,y in enumerate(data_temp['Count']):

plt.text(x-0.05,y,y,fontsize = 20)

plt.subplot(1,2,2)

sex_list = [u'男',u'女',u'性别不明']

countlist = [292,227,25]

explode = (0.05,0,0)

plt.pie(countlist,labels = sex_list,explode =explode,startangle = 90,autopct = '%3.1f%%')

plt.axis('equal')

plt.show()效果如下:

根据好友签名绘制词云Signature中保存的是好友签名,开始试了一次,发现签名中emoji表情占了好大的比例,后面用正则表达式处理了下,只保留了汉字部分。back_color = imread('tencent.jpg')  # 解析该图片wc = WordCloud(background_color='white',  # 背景颜色

max_words=1000,  # 最大词数

mask=back_color,  # 以该参数值作图绘制词云,这个参数不为空时,width和height会被忽略

max_font_size=100,  # 显示字体的最大值

font_path="/Users/tangwenpan/Downloads/simhei.ttf",  # 解决显示口字型乱码问题

random_state=42,  # 为每个词返回一个PIL颜色

)

text=''xx= u"[\u4e00-\u9fa5]" #保留汉字for x in df['Signature']:

pattern = re.compile(xx)

text_temp =  pattern.findall(x)

for xxx in text_temp:

text = text +xxxdef word_cloud(texts):

words_list = []

word_generator = jieba.cut(texts, cut_all=False)  # 返回的是一个迭代器

for word in word_generator:        if len(word) > 1:  #去掉单字

words_list.append(word)    return ' '.join(words_list)

text = word_cloud(text)

wc.generate(text)# 基于彩色图像生成相应彩色image_colors = ImageColorGenerator(back_color)

plt.figure(figsize = (15,15))

plt.axis('off')# 绘制词云plt.imshow(wc.recolor(color_func=image_colors))

plt.axis('off')# 保存图片wc.to_file('comment.png')print 'comment.png has bee saved!'使用背景图片

效果如下:

peace~

作者:Awesome_Tang

链接:https://www.jianshu.com/p/4ab4fe8ac4ce

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值