用Python爬了微信朋友

最近,看了‘小蚊子数据分析’订阅号中的一篇用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()
matplotlib.png

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()
地区分布.png

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()
微信词云.png

总结

好友中男性居多,好友省份主要分布在广东,其他省份寥寥无几,哎呀嘛,我的圈子也太小了吧,得找个机会好好出去广东以外溜达溜达了。城市分布主要是在珠三角地区,看城市能猜出我是哪个地方的人吗?词云图中,摄影师最显眼,但是有个性签名的好友很少,所以结果不具有参考性。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 之前看了一篇用python爬取了微信朋友,就一直想自己试试。本来以为爬取微信好友信息要写好多代码,发现使用itch...
    一纸行阅读 1,678评论 0 1
  • 这天山哥正在看IT动向。看到网上有人用Python和R来分析微信朋友,于是来了兴趣,也玩了一把。不过不会R,于是用...
    山哥Samuel阅读 576评论 0 0
  • --- 我的微信好友数据分析 这张图是我所有的微信好友,之前你们大部分不能互相看到,在这里,终于可以相互看一眼了。...
    向右奔跑阅读 6,093评论 19 70
  • 晨起感恩:感恩美好的周末、开心的醒来。感恩朋友的信任,感恩老师传授的知识让朋友的释放,打开她的心门hjm,看她哭,...
    刘宝莉阅读 171评论 0 0
  • 》》衔接上一篇 33 贴着他的温度,她狡黠,他不防备,被亲了个正着,楞了一下,连忙退开,“我走了。”便急急忙忙跑回...
    幽小窗阅读 539评论 16 20