最近,看了‘小蚊子数据分析’订阅号中的一篇用python爬取微信朋友的文章,决定自己动手试试。内容其实挺简单,主要是用到itchat包, 抓取微信好友的性别,所在城市,所属省份,做一个简单的统计,并提取个性签名,进行词频统计,并绘制词云图。
开发环境:
系统: macOS Sierra; 开发软件: PyChram CE; 运行环境: Python3.6
1. 登录微信
itchat.login() # 会出现一个二维码,扫码即可登录
2. 提取存储微信好友信息的json文件,并保存到本地
# 爬取好友的相关信息,返回json文件
friends = itchat.get_friends(update=True)
# 将获取的内容写入user.json文件中
fw = open('users.json', 'w')
json.dump(friends, f)
# 退出微信
itchat.logout()
3. 从json文件中获得好友性别,城市,省份和个性签名等信息
# 读取json文件
load_f = open('users.json')
Users = json.load(load_f)
# 获取想要的好友信息
NickName = [] # 定义一个列表,存储好友昵称
Sex = [] # 存储好友性别
Province = [] # 存储好友所在省份
City = [] # 存储好友所在城市
Signature = [] # 个性签名
for user in Users[1:]:
nickName = user['NickName'] # 好友昵称
sex = user['Sex'] # 好友性别
province = user['Province'] # 好友所在省份
city = user['City'] # 好友所在城市
signature = user['Signature'] # 个性签名
NickName.append(nickName)
Sex.append(sex)
Province.append(province)
City.append(city)
Signature.append(signature)
memberList = pandas.DataFrame({
'NickName': NickName,
'Sex': Sex,
'Province': Province,
'City': City,
'Signature': Signature
})
memberList.to_csv('memberList.csv', index=False)
4. 查看好友的性别比例
# 查看所有好友的性别比例( 1为男性,2为女性,0为未知)
sexStat = memberList.groupby(
by='Sex'
)['Sex'].agg({
'计数': len
}).reset_index().sort_values(
by='计数',
ascending=False
)
# 性别转换表(将1,2,0分别转化为'男', '女', '未知')
sex = []
count = []
for index, rows in sexStat.iterrows():
if rows['Sex'] == 1:
sex.append('男')
if rows['Sex'] == 2:
sex.append('女')
if rows['Sex'] == 0:
sex.append('未知')
count.append(rows['计数'])
sexTran = pandas.DataFrame({
'Sex': sex,
'计数': count
})
print(sexTran)
# 调节图形大小,宽,高
plt.rcParams['font.sans-serif'] = ['simhei']
plt.rcParams['axes.unicode_minus'] = False
# plt.figure(figsize=(6, 9))
# 定义饼状图的标签,标签是列表
labels = [sex for sex in sexTran['Sex']]
# 每个标签占多大,会自动去算百分比
sizes = [count for count in sexTran['计数']]
# 定义每块标签
colors = ['red', 'yellowgreen', 'lightskyblue']
# 将某部分爆炸出来, 使用括号,将第一块分割出来,数值的大小是分割出来的与其他两块的间隙
explode = (0.05, 0, 0)
patches, l_text, p_text = plt.pie(sizes, explode=explode, labels=labels, colors=colors,
labeldistance=1.1, autopct='%3.1f%%', shadow=False,
startangle=90, pctdistance=0.6)
# labeldistance,文本的位置离远点有多远,1.1指1.1倍半径的位置
# autopct,圆里面的文本格式,%3.1f%%表示小数有三位,整数有一位的浮点数
# shadow,饼是否有阴影
# startangle,起始角度,0,表示从0开始逆时针转,为第一块。一般选择从90度开始比较好看
# pctdistance,百分比的text离圆心的距离
# patches, l_texts, p_texts,为了得到饼图的返回值,p_texts饼图内部文本的,l_texts饼图外label的文本
# 改变文本的大小,方法是把每一个text遍历。调用set_size方法设置它的属性
for t in l_text:
t.set_size=(30)
for t in p_text:
t.set_size=(20)
# 设置x,y轴刻度一致,这样饼图才能是圆的
plt.axis('equal')
plt.legend()
plt.show()
5. 查看好友所在城市和省份的分布情况
# 查看好友所在地区分布情况
cityStat = memberList.groupby(
by=['City']
)['City'].agg({
'计数': len
}).reset_index().sort_values(
by='计数',
ascending=False
)
# 绘图(好友省份分布)
plt.subplot(2, 1, 1)
plt.title('好友省份分布')
axis1 = numpy.arange(len(provinceStat))
color = cm.jet(axis1/max(axis1))
plt.bar(axis1, provinceStat['计数'], color=color)
province = []
for p in provinceStat['Province']:
if len(p) == 0:
p = '未知'
province.append(p)
plt.grid(color='#95a5a6', axis='y', linestyle='--', linewidth=1, alpha=0.4)
plt.ylabel('好友数量')
plt.xticks(axis1, province)
# 绘图(好友城市分布)
plt.subplot(2, 1, 2)
axis2 = numpy.arange(len(cityStat))
plt.rc('font', family='simhei', size=9)
plt.title('好友城市分布')
cityStat = cityStat.sort_values('计数')
color = cm.jet(axis2/max(axis2))
plt.barh(axis2, cityStat['计数'], color=color)
city = []
for c in cityStat['City']:
if len(c) == 0:
c = '未知'
city.append(c)
plt.grid(color='#95a5a6', axis='x', linestyle='--', linewidth=1, alpha=0.4)
plt.xlabel('好友数量')
plt.yticks(axis2, city)
plt.show()
6. 对好友个性签名统计词频,并绘制词云图
# 好友个性签名词频统计及词云绘制
signature_list = []
# 删除个性签名中的表情符号和除文字以外的所有符号
for user in Users:
signature = user['Signature'].strip().replace('span', '')\
.replace('class', '').replace('emoji', '')
rep = re.compile('1f\d+\w*|[<>/=]')
signature = rep.sub('', signature)
if len(signature.strip()) > 0:
signature_list.append(signature)
# 对个性签名进行分词处理
text = ''.join(signature_list)
signature_seg = jieba.cut(text)
signature_seg = ' '.join(signature_seg)
# 绘制词云图
from wordcloud import WordCloud
bimg = imread('data/贾宝玉.png')
wordCloud = WordCloud(
background_color='white',
font_path='data/simhei.ttf',
stopwords='data/StopwordsCN.txt',
mask=bimg
)
wordCloud = wordCloud.generate(signature_seg)
bimgColors = ImageColorGenerator(bimg)
plt.imshow(wordCloud.recolor(color_func=bimgColors))
plt.axis("off")
plt.show()
总结
好友中男性居多,好友省份主要分布在广东,其他省份寥寥无几,哎呀嘛,我的圈子也太小了吧,得找个机会好好出去广东以外溜达溜达了。城市分布主要是在珠三角地区,看城市能猜出我是哪个地方的人吗?词云图中,摄影师最显眼,但是有个性签名的好友很少,所以结果不具有参考性。