1、wxpy
最近研究了一些微信的玩法,我们可以通过网页版的微信微信网页版,扫码登录后去抓包爬取信息,还可以post去发送信息。
然后发现了wxpy这个库,已经把微信的接口完成了,大大的方便了我们对微信的挖掘,以下的功能也通过wxpy来实现。
安装wxpy这个库
pip install wxpy
先来段简单的试用,实现微信的登录,运行下面代码会生成一个二维码,扫码之后手机端确认登录,按照惯例,先发送一条‘hello world’给自己,语句是bot.file_helper.send(‘hello world!’),其实是通过文件传输助手发送的消息, 也可以使用bot.self.send(“hello world”)。
from wxpy import *
bot = Bot(cache_path=True)
bot.file_helper.send('hello world!')
其中cache_path=True可以避免每次登陆都需要重新扫描,具有缓存的作用。
除了给自己发送消息当然也可以给朋友发送消息了
bot = Bot(cache_path=True)
my_friend = bot.friends().search("马面")[0]
my_friend.send("hello world!")
# 获取所有好友
friends = bot.friends()
# 遍历输出好友名称for friend in friends:
print(friend)
# 获取所有聊天群
groups = bot.groups()
for group in groups:
print(group)
# 找到目标群
group = groups.search("family")[0]
group.send("hello world!")
除了登录和发送消息我们还可以这么来玩,往下走~
2、微信好友男女比例
想统计下自己微信里好友的性别比例,当然也是很简单,先获取好友列表,统计列表里性别计数
from wxpy import *
def get_friend_sex(friends):
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
return male, female, other
bot = Bot(cache_path=True)
bot.file_helper.send('hello world!')
friends = bot.friends()
male, female, other = get_friend_sex(friends)
total = len(friends[1:])
# 好了,打印结果
print("男性好友:%.2f%%" % (float(male) / total * 100))
print("女性好友:%.2f%%" % (float(female) / total * 100))
print("其他:%.2f%%" % (float(other) / total * 100))
(好吧,暴露了我男性友人较多的真相~~)
好像不够直观,有兴趣的朋友可以加上可视化的展示, 我这里使用了 matplotlib(有机会再细说)
直接上代码
from wxpy import *
import matplotlib.pyplot as plt
def get_friend_sex(friends):
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
return male, female, other
bot = Bot(cache_path=True)
friends = bot.friends()
male, female, other = get_friend_sex(friends)
total = len(friends[1:])
my_name = friends[0].nick_name
# 每部分名称
sex_name = ['男性', '女性 ', '其他']
# 每部分数量,会自动计算百分比
sex_count = [male, female, other]
# 画布大小
plt.figure(figsize=(20, 9), dpi=100)
# 绘制饼图
plt.pie(sex_count, labels=sex_name, autopct="%.2f%%", colors=['b', 'r', 'g'])
# 显示图例
plt.legend()
# 添加标题
plt.title('%s的微信好友性别比例from WeChat' % my_name)
# 保证长宽一样
plt.axis('equal')
# 显示图像
plt.show()
3、好友个性签名词云
主要是想看下朋友的个性签名中的高频词语
from wxpy import *
bot = Bot(cache_path=True)
friends = bot.friends()
for i in friends:
signature = i.signature.strip()
print(signature)
先全部抓取下来
打印之后你会发现,有大量的span,class,emoji,emoji1f3c3等的字段,因为个性签名中使用了表情符号,这些字段都是要过滤掉的,写个正则过滤掉。
from wxpy import *
import re
bot = Bot(cache_path=True)
friends = bot.friends()
for i in friends:
signature = i.signature.strip()
rep = re.compile("<span.*emoji1f\d.+</span>")
signature = rep.sub("", signature)
print(signature)
接来下用jieba分词,然后制作成词云,首先要安装jieba和wordcloud库
pip install jieba
pip install wordcloud
代码
import re
from wxpy import *
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import jieba
bot = Bot(cache_path=True)
friends = bot.friends()
tList = []
for i in friends:
signature = i.signature.strip()
rep = re.compile("<span.*emoji1f\d.+</span>")
signature = rep.sub("", signature)
tList.append(signature)
# 拼接字符串
text = "".join(tList)
wordlist_jieba = jieba.cut(text, cut_all=True)
wl_space_split = " ".join(wordlist_jieba)
my_wordcloud = WordCloud(background_color="white", max_words=2000,
max_font_size=40, random_state=42,
font_path='c:\\windows\\Fonts\\simhei.ttf').generate(wl_space_split)
plt.figure(figsize=(40, 16), dpi=150)
plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()
运行代码
这。。好像有点丑,根据wordcloud用法,可以找一张图来生成配色方案,我这里找了一张小黄人的图片
修改一下代码
import re
from wxpy import *
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
import numpy as np
import jieba
import PIL.Image as Image
import os
bot = Bot(cache_path=True)
friends = bot.friends()
tList = []
for i in friends:
signature = i.signature.strip()
rep = re.compile("<span.*emoji.+</span>")
signature = rep.sub("", signature)
tList.append(signature)
# 拼接字符串
text = "".join(tList)
d = os.path.dirname(__file__)
wordlist_jieba = jieba.cut(text, cut_all=True)
wl_space_split = " ".join(wordlist_jieba)
alice_coloring = np.array(Image.open(os.path.join(d, "wechat.jpg")))
my_wordcloud = WordCloud(background_color="white", max_words=2000, mask=alice_coloring,
max_font_size=40, random_state=42,
font_path='c:\\windows\\Fonts\\simhei.ttf').generate(wl_space_split)
image_colors = ImageColorGenerator(alice_coloring)
plt.figure(figsize=(40, 16), dpi=150)
plt.imshow(my_wordcloud.recolor(color_func=image_colors))
plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()
然后还有微信自动回复,爬取表情包斗图,这些都是可以实现的,感兴趣的可以自行研究或者加我好友讨论一下。
个人微信:wukangcumt