本次主要对微信好友的信息获取,包括微信备注名称、省份、城市、个性签名、性别,对其中的个性签名就行词云的制作和对性别的统计。由于微信好友城市分布不多,主要都是集中在一个地区,所以就做地区分布图也没有什么意义;数据存储到mysql当中。
导入包
from wxpy import Bot---微信机器人
from PIL import Image---图片处理
from wordcloud import WordCloud---词云制作
import pygal---条形图制作
import numpy---格式转换
import jieba---分词处理
import pymysql---数据库操作
import re---正则表达式
wxpy的使用
https://wxpy.readthedocs.io/zh/latest/这是wxpy的使用文档,可以从里面知道如何去使用,这里就不多说了,下面直接上代码说话。
获取好友信息
在好友的性别sex信息中,sex的值有两个,为1的时候是男性,为2的时候是女性,其他没有备注性别的,我们这里定义为‘None’。
# 获取好友信息
def get_friends():
# 初始化机器人并获取朋友列表
friends=Bot().friends()
# print(friends)
sex=''
for friend in friends[1:]:
# print(friend)
# print(friend.name+','+friend.province+','+friend.city+','+friend.signature+','+str(friend.sex))
if friend.sex==1:
# 男性
sex='男'
elif friend.sex==2:
# 女性
sex='女'
else:
# 未知
sex='None'
yield{
# 备注名称
'name':friend.name,
# 省份
'province':friend.province,
# 城市
'city':friend.city,
# 个性签名
'signature':friend.signature,
# 性别
'sex':sex
}
数据存储
把数据存储到mysql中去,数据库中表的字段有:name、province、city、signature、sex。由于备注名和个性签名中带有表情emoji,所以存储的时候会出现错误。因为这边的mysql的存储数据格式的字符集是utf8,校对规则为utf8_general_ci,无法储存4个字节的表情,所以就其中的字段name和signature的字符集做了转换,转换为utf8mb4_unicode_ci。
windows下的数据库操作
命令行连接数据库:mysql -h 主机地址 -u用户名 -p,回车输入密码。
选择数据:use 数据库名称
修改字段的charset: ALTER TABLE `table_name` MODIFY `column_name` VARCHAR(50) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 数据存储
def save_sql(contents):
# 连接数据库
conn=pymysql.connect(host='127.0.0.1',user='root',passwd='root',db='mysql',port=3306,charset='utf8mb4')
# 设置游标
cur=conn.cursor()
# 选择数据库
cur.execute(' USE db_wxpy')
i=0
for friend in contents:
i+=1
try:
# 插入数据
cur.execute('insert into friends values(%s,%s,%s,%s,%s)',(friend['name'],friend['province'],friend['city'],friend['signature'],friend['sex']))
except Exception as e:
print(e)
pass
conn.commit()
cur.close()
conn.close()
# 微信好友统计
print(str(i))
数据读取
# 数据读取
def read_sql(column):
# 连接数据库
conn=pymysql.connect(host='127.0.0.1',user='root',passwd='root',db='mysql',port=3306,charset='utf8')
# 设置游标
cur=conn.cursor()
cur.execute('USE db_wxpy')
cur.execute('select '+column+' from friends')
# 返回元组
column_msgs=cur.fetchall()
cur.close()
conn.close()
return column_msgs
词云制作
def signature_wordcloud(signature_msgs):
str=''
signature_msgs=list(signature_msgs)
# 去除空的个性签名
while ('',) in signature_msgs:
signature_msgs.remove(('',))
for signature_msg in signature_msgs:
# 字符串拼接
str+=signature_msg[0]
# 去除<span class="emoji emoji1f63d"></span><span class="emoji emoji1f63d">标签和换行符
while True:
if str:
result=re.search('<span .*?/span>|\n',str)
if result:
str=str.replace(result.group(),'')
else:
break
else:
print('为空')
break
str=jieba.cut(str)
str=''.join(str)
# 打开图片
image_arry=numpy.array(Image.open('wood_man.jpg'))
wc=WordCloud(font_path='C:/Windows/Fonts/simsun.ttc',background_color='white',width=554,height=446,mask=image_arry)
wc.generate(str)
wc.to_file('wood.jpg')
性别统计
# 性别统计
def count_sex(sex):
gender=read_sql(sex)
gender_lists=list(gender)
male,female,other=0,0,0
for gender_list in gender_lists:
if gender_list[0] =='男':
male+=1
elif gender_list[0] =='女':
female+=1;
else:
other+=1
bar=pygal.Bar()
bar.title='男女比例'
bar.x_labels=['男','女','其他']
number=[]
number.append(male)
number.append(female)
number.append(other)
bar.add('',number)
# print(number)
bar.render_to_file('男女比例.svg')
完整代码:链接:https://pan.baidu.com/s/110Nw11sEC2RdzwELiRVogg 密码:3740