你的微信朋友圈到底长什么样?
- 2019 年 10 月 8 日
- 笔记
作者 | 张大炮
来源 | 1024程序开发者社区
本文转载自毛利学Python
现在微信是个人生活的重要部分之一,也是一种常用的中文社交网络应用程序。itchat是微信的开源API,当你掌握了Python的使用技巧,就可以轻松看到自己朋友圈到底是什么样子:

这是笔者所有微信好友的头像拼图。下面分三部分介绍具体实现方法。
/1/模拟登陆与省份信息获取
调用itchat库中函数login(),可以直接生成一个二维码,这个二维码其实就是平时登陆web微信时候的二维码,你用手机微信扫这个二维码后,程序会模拟成你登陆进微信,进而对微信进行一系列操作。对应代码:
# False 每次登陆需要扫码 True可自动登录 itchat.auto_login(False)
定义get_province()函数获取好友所在省份信息。
def friends_province(): # 获取好友省份 province= get_data("Province") province_distribution = {} for item in province: if bool(re.search('[a-z]',item)): continue elif not province_distribution.__contains__(item): province_distribution[item] = 1 else: province_distribution[item] += 1 #将省份名为空的删除 province_distribution.pop('') province_keys=province_distribution.keys() province_values=province_distribution.values() return province_keys,province_values
通过pyechart的map,bar函数对好友省份数据进行绘图,结果如下:


通过上图可直观看出好友的位置分布。
/2/性别信息的获取与可视化
定义get_sex()函数进行性别数据爬取和绘图。
def get_sex(): my_friends = itchat.get_friends(update=True)[0:] sex = {"male": 0, "female": 0, "other": 0} for item in my_friends[1:]: s = item["Sex"] if s == 1: sex["male"] += 1 elif s == 2: sex["female"] += 1 else: sex["other"] += 1 total = len(my_friends[1:]) attr = list(sex.keys()) v1 = list(sex.values()) pie = Pie("好友性别比例") pie.add("", attr, v1, v1, is_label_show=True) pie.render(path="sex_html/sex.html")
通过pie函数画出饼状图(男女比例确实比较尬),其中other是未标注的好友:

/3/好友签名信息和绘制云图
定义friend_signature函数,获取好友个性签名,对于签名中有emoji表情的进行处理。
def friends_signature(): signature = get_data("Signature") wash_signature=[] for item in signature: #去除emoji表情等非文字 if "emoji" in item: continue rep = re.compile("1fd+w*|[<>/=【】‘’♂ω]") item=rep.sub("", item) wash_signature.append(item) words="".join(wash_signature) wordlist = jieba.cut(words, cut_all=True) word_space_split = " ".join(wordlist) global NickName global Sex coloring = np.array(Image.open("standard/boy.jpg")) my_wordcloud = WordCloud(background_color="white", max_words=800, mask=coloring, max_font_size=120, random_state=30, scale=2,font_path="fonts/simkai.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() # 保存图片 my_wordcloud.to_file('Signature/signature.png')
通过jieba函数对数据进行分词,并用Wordcloud画图,此处需要一个模板图,可根据个人喜好进行设置。

/4/头像获取与拼接
定义get_img()函数获取好友图像。
def get_img(): os.chdir('F:Python_codeWeb_Spiderwechatimg') for friend in itchat.get_friends(update=True)[0:]: print(friend['NickName'] + "(" + friend['RemarkName'] + ")") img = itchat.get_head_img(userName=friend["UserName"]) path = friend['NickName'] + "(" + friend['RemarkName'] + ").jpg" try: with open(path, 'wb') as f: f.write(img) except Exception as e: print(repr(e))
运行程序,将数据存储于文件夹中,通过图像拼接,将好友图像拼接于一张图片上。
NewImage = Image.new('RGB', (128*line,128*line)) x = y = 0for item in pathList: try: img = Image.open(item) x += 1 except IOError: print("第%d行,%d列文件读取失败!IOError:%s" % (y,x,item)) x -= 1 if x == line: x = 0 y += 1 if (x+line*y) == line*line: breakNewImage.save("final.jpg")
最终结果为文章开头所示。
/5/开发环境
- 版本:python3.5.2
- 编程软件:pycharm
- pip install pyecharts
- pip install itchat
- pip install PIL.Image
- pip install jieba
- pip install wordcloud
公众号中回复“朋友圈”,获取代码链接。