原文链接:https://mp.weixin.qq.com/s/4EXgR4GkriTnAzVxluJxmg
「itchat」一个开源的微信个人接口,今天我们就用itchat爬取微信好友信息,无图言虚空 三张图分别是「微信好友头像拼接图」、「性别统计图」、「个性签名统计图」
「微信好友头像拼接图」
「性别统计图」
「个性签名统计图」
安装
主要用到的方法:itchat.login()
微信扫描二维码登录itchat.get_friends()
返回完整的好友列表,每个好友为一个字典, 其中第一项为本人的账号信息,传入update=True
, 将更新好友列表并返回, get_friends(update=True)
itchat.get_head_img(userName="")
根据userName
获取好友头像
微信好友头像拼接图 获取好友信息,get_head_img
拿到每个好友的头像,保存文件,将头像缩小拼接至一张大图。 先获取好友头像:
1 2 3 4 5 6 7 8 9 10 def headImg () : itchat.login() friends = itchat.get_friends(update=True ) for count, f in enumerate(friends): img = itchat.get_head_img(userName=f["UserName" ]) imgFile = open("img/" + str(count) + ".jpg" , "wb" ) imgFile.write(img) imgFile.close()
这里需要提前在同目录下新建了文件夹img
,否则会报No such file or directory
错误,img
用于保存头像图片,遍历好友列表,根据下标count
命名头像,到这里可以看到文件夹里已经保存了所有好友的头像。
接下来就是对头像进行拼接
遍历文件夹的图片,random.shuffle(imgs)
将图片顺序打乱
用640*640的大图来平均分每一张头像,计算出每张正方形小图的长宽,压缩头像,拼接图片,一行排满,换行拼接,好友头像多的话,可以适当增加大图的面积,具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 def createImg () : x = 0 y = 0 imgs = os.listdir("img" ) random.shuffle(imgs) newImg = Image.new('RGBA' , (640 , 640 )) width = int(math.sqrt(640 * 640 / len(imgs))) numLine = int(640 / width) for i in imgs: img = Image.open("img/" + i) img = img.resize((width, width), Image.ANTIALIAS) newImg.paste(img, (x * width, y * width)) x += 1 if x >= numLine: x = 0 y += 1 newImg.save("all.png" )
好友头像图成型,头像是随机打乱拼接的
性别统计图 同样itchat.login()
登录获取好友信息,根据Sex
字段判断性别,1 代表男性(man),2 代表女性(women),3 未知(unknown)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 def getSex () : itchat.login() friends = itchat.get_friends(update=True ) sex = dict() for f in friends: if f["Sex" ] == 1 : sex["man" ] = sex.get("man" , 0 ) + 1 elif f["Sex" ] == 2 : sex["women" ] = sex.get("women" , 0 ) + 1 else : sex["unknown" ] = sex.get("unknown" , 0 ) + 1 for i, key in enumerate(sex): plt.bar(key, sex[key]) plt.show()
性别统计柱状图
个性签名统计图 获取好友信息,Signature
字段是好友的签名,将个性签名保存到.txt文件,部分签名里有表情之类的会变成emoji 类的词,将这些还有特殊符号的替换掉。
1 2 3 4 5 6 7 8 9 10 def getSignature () : itchat.login() friends = itchat.get_friends(update=True ) file = open('sign.txt' , 'a' , encoding='utf-8' ) for f in friends: signature = f["Signature" ].strip().replace("emoji" , "" ).replace("span" , "" ).replace("class" , "" ) rec = re.compile("1f\d+\w*|[<>/=]" ) signature = rec.sub("" , signature) file.write(signature + "\n" )
sign.txt
文件里写入了所有好友的个性签名,使用wordcloud包生成词云图,pip install wordcloud
同样可以采用jieba
分词生成词图,不使用分词的话就是句子展示,使用jieba
分词的话可以适当把max_font_size
属性调大,比如100。 需要注意的是运行不要在虚拟环境下,deactivate
退出虚拟环境再跑,详细代码如下:
生成词云图 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 def create_word_cloud (filename) : text = open("{}.txt" .format(filename), encoding='utf-8' ).read() wc = WordCloud( background_color="white" , max_words=2000 , font_path='C:\\Windows\\Fonts\\simfang.ttf' , height=500 , width=500 , max_font_size=60 , random_state=30 , ) myword = wc.generate(text) plt.imshow(myword) plt.axis("off" ) plt.show() wc.to_file('signature.png' )
句子图
由此看来,一个20多岁程序员小伙的朋友圈满满都是正能量啊,2333。
itchat 除了以上的信息,还有省市区等等信息都可以抓取,另外还可以实现机器人自动聊天等功能,这里就不一一概述了。
具体代码请见https://github.com/HMY626/itchat_wechat