引言

本篇博文承接着上一篇web微信的内容进行叙述,在上一篇的结尾我提出了可以用微信接口,也就是itchat来获取我们的用户信息,这样相对而言比较安全,降低了频率过高导致的封号的风险,而且更有利于开发,那么本篇就是基于微信的一些数据进行了相应的可视化处理。(最近很久没更新博文,本来这篇是10号左右就完成的,但我的老毛病又犯了,每次晚上写到一半没有点保存,本篇连续两次,csdn没有帮我保存的功能,只能疯狂重写。。可能本篇有些地方语言会不通顺,是我的锅)

itchat模块介绍

itchat模块包应该是我看过的最火的几个python模块包之一,在GitHub上它的star数量已经达到了1.6w颗,这还不包括它的相近项目,wxpy、wxBot等,而在它的官方简介里,有这样一句话:“itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单。使用不到三十行的代码,你就可以完成一个能够处理所有信息的微信机器人。”事实上确实如此,itchat基本上完成了基于微信的大部分开发功能。我们只需要pip安装,就能体验到它的所有功能。链接如下:

A complete wechat personal account api

itchat如果按功能来分类的话,我看源码的意思是能分成5类,分别是contact、hotreload、login、messages和register,而我之前写过一篇基于flask加ajax实现web模拟登录以及获取信息的博文,所以这里我重点描述一下itchat的login模块。我上一篇文章原文链接(构造一个对比):flask加ajax实现web微信。

好了,那我们进入components下的login模块内:

def load_login(core):core.login             = login # core.get_QRuuid        = get_QRuuidcore.get_QR            = get_QRcore.check_login       = check_logincore.web_init          = web_initcore.show_mobile_login = show_mobile_logincore.start_receiving   = start_receivingcore.get_msg           = get_msgcore.logout            = logout

在上一篇博文里实现了这里的差不多5种方法,当然都是简单实现。我们可以挑选一个看,比如说是check_login,它的版本为:

def check_login(self, uuid=None):uuid = uuid or self.uuidurl = '%s/cgi-bin/mmwebwx-bin/login' % config.BASE_URLlocalTime = int(time.time())params = 'loginicon=true&uuid=%s&tip=1&r=%s&_=%s' % (uuid, int(-localTime / 1579), localTime)headers = { 'User-Agent' : config.USER_AGENT }r = self.s.get(url, params=params, headers=headers)regx = r'window.code=(\d+)'data = re.search(regx, r.text)if data and data.group(1) == '200':if process_login_info(self, r.text):return '200'else:return '400'elif data:return data.group(1)else:return '400'

它开始同样是制造了一个time时间戳,再拼接到url上去。这里的参数为什么有三个,还有int(-localTime / 1579),我之前的只拼接了两个,虽然也能用,但确实没有它考虑得那么周到,最后是通过验证码判断用户是否扫码以及确认登录,逻辑不论怎么变基本都类似,这里同样也是考虑三种状态下的验证码,对应着登录过程中的三种状态。

另外需要注意的是: GitHub上的官网教程偏向于机器人操作,即可以实现自动回复,登录获取好友信息等,而如果比较感兴趣的朋友,可能会去查更全面的功能,然后网上是有很多其它方向扩展的,比如说是多线登录,运用手机号创建微信以及创建微信群,然后微信群发等,我很早之前尝试过,但没有太过深入,因为这是一个雷区,微信对其监管是很严的,比如说微信创群加群发,这就完成了无限制的软广,如果不禁止,那基本都是机器人了,所以宁可错杀一千,也不放过一个,最好别碰。

pyecharts模块介绍

pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的图可视化效果非常棒,为了与 Python 进行对接,方便在 Python 中直接使用数据生成图,所以经由几个大佬一起共同完成了这个轮子,GitHub地址为:https://github.com/pyecharts/pyecharts

并且他们用flask加pyecharts搭了一个展示图的效果网站,地址为:http://pyecharts.herokuapp.com
而官网为:https://pyecharts.org

比较推荐阅读一下,我觉得很多东西都挺有意思的,比如说里面还有日历图,关系图和漏斗图等,日历图的例子它是以随机模拟了微信步数的差不多一年的数据,然后我就想了下,我可以就最近几个月的数据进行制作,还有关系图,虽然它没有ucinet软件那么的专业,我看组件的源码还是根据频率来描述节点的关系,但我还是看到了一丝专业性的。嗯,其余的我就不过多介绍了,需要什么图可以对比着来分析一下整个结构。比如说柱形图:

取自pyecharts 图表基本配置项,它里面还有对上述各部位的很多详解,我从中还是学到了以前我忽略掉的很多东西。然后我们可以看看pyechart主要的属性与方法,见如下表格:

属性方法 说明
add() 主要方法,用于添加图表的数据和设置各种配置项
render() 生成本地文件(html/svg/jpeg/png/pdf/gif),默认html
xyAxis 平面直角坐标系中的 x、y 轴
legend 图例组件。图例组件展现不同颜色名字等。可以通过点击控制哪些不显示。
label 图形上的文本标签,可用于说明图形的一些数据信息,比如值,名称等
grid3D 3D笛卡尔坐标系组配置项,适用于 3D 图形
axis3D 3D 笛卡尔坐标系 X,Y,Z 轴配置项,适用于 3D 图形
tooltip 提示框组件,用于移动或点击鼠标时弹出数据内容

而我们此处使用pyecharts的大致步骤为:

  1. 引入 Page 类,from pyecharts import Page
  2. 实例化 Page 类,page = Page()
  3. 使用 add() 向 page 中添加图
  4. 使用 page.render() 渲染生成页面文件

所以话不多说,进入数据可视化环节。

itchat的使用

import re
import itchat
import os,random,math
import pandas as pd
from PIL import Image
from pyecharts import Pie, Map, Style, Page, Bar# 根据key值得到对应的信息
def get_key_info(friends_info, key):return list(map(lambda friend_info: friend_info.get(key), friends_info))# 获得所需的微信好友信息
def get_friends_info():itchat.auto_login(hotReload=True)friends = itchat.get_friends()friends_info = dict(# 省份province=get_key_info(friends, "Province"),# 城市city=get_key_info(friends, "City"),# 昵称nickname=get_key_info(friends, "Nickname"),# 性别sex=get_key_info(friends, "Sex"),# 签名signature=get_key_info(friends, "Signature"),# 备注remarkname=get_key_info(friends, "RemarkName"),# 用户名拼音全拼pyquanpin=get_key_info(friends, "PYQuanPin"),# 用户名username = get_key_info(friends,"UserName"))return friends_info# 性别分析
def analysisSex():friends_info = get_friends_info()# 男女性别比例sex_list = friends_info['sex']from collections import Countersex_dict = dict(Counter(sex_list))attr = ["未知", "男性", "女性"]value = [sex_dict[0], sex_dict[1], sex_dict[2]]page = Page()chart1 = Pie("微信好友性别比例图", title_pos='center')  # 标题放在中间chart1.add("", attr, value, is_label_show=True, legend_orient="vertical", legend_pos="left")  # 显示标签,图例组件垂直分布,图例位于左侧page.add(chart1)  # 把chart1添加到页面中page.render('C:/Users/xuzhenggen/Desktop/data/123/analysisSex.html')# 处理数据
def count_nums(new_list):new_dict = {}for i in new_list:if bool(re.search('[a-z]|[A-Z]', i)):   # 如果带英文字母(要么是国外,要么是乱写的)就跳出本次循环continueelif not new_dict.__contains__(i):new_dict[i] = 1else:new_dict[i] += 1new_dict.pop('')   # 去掉空的键return new_dictdef analysisProvince():friends_info = get_friends_info()# 中国省级分析province_list = friends_info['province']province_dict = count_nums(province_list)attr, value = list(province_dict.keys()), list(province_dict.values())# 中国省级分析画图page = Page()chart2 = Map('好友省级分布(中国地图)', width=1200, height=600)   #设置图像的长和高的像素值chart2.add('', attr, value, maptype='china', is_label_show=True, is_visualmap=True, visual_text_color='#000')   #地图类型为中国,显示标签数据,使用视觉映射组件,文本颜色为黑色page.add(chart2)   #把chart2添加到页面中page.render('C:/Users/xuzhenggen/Desktop/data/123/analysisProvince.html')def analysisTop():friends_info = get_friends_info()# 中国城市分析(取前10个人数最多的城市)city_list = friends_info['city']city_dict = count_nums(city_list)top_ten_city = dict(sorted(city_dict.items(), key=lambda x: x[1], reverse=True)[0:10])attr, value = list(top_ten_city.keys()), list(top_ten_city.values())# 中国城市分析画图page = Page()chart3 = Bar('好友城市分布Top10柱状图', width=900, height=500)   #设置图形的长和宽chart3.add('', attr, value, is_stack=False,is_label_show=True,bar_category_gap='20%')   #把数据堆叠设置为False,显示标签,类目轴的柱状距离为20%page.add(chart3)   #把chart3添加到页面中page.render('C:/Users/xuzhenggen/Desktop/data/123/analysisTop.html')   #生成整个页面,命名为analysisResult.html# 具体省份分析
def analysisCity(province):friends_info = get_friends_info()df = pd.DataFrame(friends_info)temp1 = df.query('province == "%s"' % province)city_count = temp1.groupby('city', as_index=True)['city'].count().sort_values()attr = list(map(lambda x: '%s市' % x if x != '' else '未知', list(city_count.index)))value = list(city_count)# 画图page = Page()style = Style(width=1100, height=600)style_middle = Style(width=900, height=500)chart1 = Map('%s好友分布' % province, **style.init_style)chart1.add('', attr, value, maptype='%s' % province, is_label_show=True,is_visualmap=True, visual_text_color='#000')page.add(chart1)chart4 = Bar('%s好友分布柱状图' % province, **style_middle.init_style)chart4.add('', attr, value, is_stack=True, is_convert=True, label_pos='inside', is_label_show=True)page.add(chart4)page.render('C:/Users/xuzhenggen/Desktop/data/123/analysisCity.html')# 保存微信好友的头像到本地
def get_head_img():friends_info = get_friends_info()username = friends_info['username']for i, uname in enumerate(username):with open("headImgs/" + str(i) + ".png", "wb") as f:img = itchat.get_head_img(uname)f.write(img)# 使用微信好友头像,根据输入的像素值大小,生成一张图片
def create_img():x = 0y = 0imgs = os.listdir("headImgs")  # 返回 headImgs 目录下的文件列表random.shuffle(imgs)  # 将文件列表随机排序input_length = int(input("请输入手机屏保长的像素值(一般是两个值中较大的值):"))input_width = int(input("请输入手机屏保宽的像素值(一般是两个值中较小的值):"))new_img = Image.new('RGBA', (input_width, input_length))   # 创建 长*宽 的图片用于填充各小图片width = int(math.sqrt(input_length * input_width / len(imgs)))   # 以 长*宽 来拼接图片,math.sqrt()开平方根计算每张小图片的宽高num_line = int(input_width / width)   # 每行图片数for i in imgs:  #对每一张图片逐个进行处理try:img = Image.open("headImgs/" + i)except IOError:print("第{}张图片为空".format(i))  #可能会出现某张图片为空的情况else:img = img.resize((width, width), Image.ANTIALIAS)   # 缩小图片new_img.paste(img, (x * width, y * width))   # 拼接图片,一行排满,换行拼接x += 1if x >= num_line:x = 0y += 1new_img.save("mixedImg.png")# itchat.send_image('mixedImg.png', toUserName='filehelper')   #通过文件传输助手发送到自己微信中#newImg.show()

此处代码经由实验楼,然后再原基础上进行了修改与扩展,代码注释已经很详细了,那么我们直接来看结果吧。

看来我还是比较偏直男的。


户籍所在地与现居地。




不论是从全国城市还是省级里的城市,深圳的人数都是最多。然后我们就可以对好友头像做成一张完整的头像图:

另外我之前还看到了关于调用腾讯优图能进行情感分析,这个我们也可以申请一个账号尝试下:

代码修改自利用python进行微信好友数据分析

import itchat
import numpy as np
import os
from collections import Counter
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']      #绘图时可以显示中文
plt.rcParams['axes.unicode_minus']=False        #绘图时可以显示中文
import TencentYoutuyun
from wordcloud import WordCloud,STOPWORDS,ImageColorGenerator
from PIL import Image
import time
import re
import snownlp
import jieba
import jieba.analyse
import pandas as pddef analyseHeadImage(frineds):# Init PathbasePath = os.path.abspath('.')baseFolder = basePath + '\\HeadImages\\'if (os.path.exists(baseFolder) == False):os.makedirs(baseFolder)else:passuse_face = 0#使用人脸not_use_face = 0#未使用人脸appid = '10166060'secret_id = '申请的id'secret_key = '申请的key'end_point = TencentYoutuyun.conf.API_YOUTU_END_POINTyoutu = TencentYoutuyun.YouTu(appid, secret_id, secret_key,end_point)image_tags = ""for index in range(1, len(friends)):friend = friends[index]# Save HeadImagesimgFile = baseFolder + '\\Image%s.jpg' % str(index)imgData = itchat.get_head_img(userName=friend['UserName'])if (os.path.exists(imgFile) == False):with open(imgFile, 'wb') as file:file.write(imgData)# Detect Facestime.sleep(1)result = youtu.DetectFace(imgFile)if result == True:use_face += 1else:not_use_face += 1# Extract Tagsresult2 = youtu.imagetag(imgFile)image_tags += (",".join(list(map(lambda x: x['tag_name'], result2['tags']))) + ',')  # 将标签文件连接到一起labels = [u'使用人脸头像', u'不使用人脸头像']counts = [use_face, not_use_face]colors = ['red', 'yellowgreen', 'lightskyblue']plt.figure(figsize=(8, 5), dpi=80)plt.axes(aspect=1)plt.pie(counts,  # 性别统计结果labels=labels,  # 性别展示标签colors=colors,  # 饼图区域配色labeldistance=1.1,  # 标签距离圆点距离autopct='%3.1f%%',  # 饼图区域文本格式shadow=False,  # 饼图是否显示阴影startangle=90,  # 饼图起始角度pctdistance=0.6  # 饼图区域文本距离圆点距离)plt.legend(loc='upper right', )plt.title(u'%s的微信好友使用人脸头像情况' % friends[0]['NickName'])plt.show()image_tags = image_tags.encode('iso8859-1').decode('utf-8')back_coloring = np.array(Image.open('face.jpg'))wordcloud = WordCloud(font_path='simfang.ttf',background_color="white",max_words=1200,mask=back_coloring,max_font_size=75,random_state=45,width=800,height=480,margin=15)wordcloud.generate(image_tags)plt.imshow(wordcloud)plt.axis("off")plt.show()def fun_analyse_Signature(friends):signatures = ''emotions = []for friend in friends:signature = friend['Signature']if signature != None:signature = signature.strip().replace("span","").replace("class","").replace("emoji","")#去除无关数据signature = re.sub(r'1f(\d.+)',"",signature)if len(signature) > 0:nlp = snownlp.SnowNLP(signature)emotions.append(nlp.sentiments)#nlp.sentiments:权值signatures += " ".join(jieba.analyse.extract_tags(signature,5))#关键字提取back_coloring = np.array(Image.open("face.jpg"))#图片可替换word_cloud2 = WordCloud(font_path = 'simkai.ttf',background_color = 'white',max_words = 1200,mask = back_coloring,margin = 15)word_cloud2.generate(signatures)image_colors = ImageColorGenerator(back_coloring)plt.figure(figsize=(8,5),dpi=160)plt.imshow(word_cloud2.recolor(color_func=image_colors))plt.axis("off")plt.show()word_cloud2.to_file("signatures.jpg")
#人生观count_positive = len(list(filter(lambda x:x>0.66,emotions)))#大于0.66为积极count_negative = len(list(filter(lambda x:x<0.33,emotions)))#小于0.33为消极count_neutral = len(list(filter(lambda x:x>=0.33 and x <= 0.66,emotions)))labels = [u'积极',u'中性',u'消极']values =(count_positive,count_neutral,count_negative)plt.rcParams['font.sans-serif'] = ['simHei']plt.rcParams['axes.unicode_minus'] = Falseplt.xlabel("情感判断")plt.ylabel("频数")plt.xticks(range(3),labels)plt.legend(loc='upper right')plt.bar(range(3),values,color='rgb')plt.title(u'%s的微信好友签名信息情感分析情况' % friends[0]['NickName'])plt.show()

上述构建词云需要一张图做参照,我们还是拿之前我另一篇博文利用argparse生成字符文件的图:


然后以下是生成的图:

上面女孩和男孩的词云比较明显,我感觉也差不多,看起来是有很多的好友喜欢用人脸作为头像,然后本来还有一个使用人脸情况的比例图,但中途因为我没有对matplotlib进行相关编码,图是有,但乱码严重,这个程序跑得比较慢,我就不放了,应该可以跑出来。可能这也导致第二张图有些模糊。


可以看到科研和领先占得比重较大。

总结

最近状态不是很好,有各种各样的原因吧,所以很久没更新。外加有时候晚上弄得很晚,没有保存,导致下一天打开发现之前写的都没了确实有点崩溃。上述的图表第二版是有比较详细说明的,这是第三版。。嗯,就这样吧,没有啥太多总结的。最近有点心累,我觉得是要换一种生活方式了。

参考与推荐:
[1]. 『数据可视化』基于Python的数据可视化工具
[2]. python的pyecharts绘制各种图表详细(代码)
[3]. 基于Python实现的微信好友数据分析

python利用itchat接口和pyecharts包进行数据可视化相关推荐

  1. python画饼状图的包_Python数据可视化:画饼状图、折线图、圈图

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. from math import pi import matplotlib ...

  2. Py之pyecharts:python包之数据可视化包pyecharts简介、安装、使用方法之详细攻略

    Py之pyecharts:python包之数据可视化包pyecharts简介.安装.使用方法之详细攻略 目录 pyecharts简介 pyecharts的安装 pyecharts的使用方法 1.图形绘 ...

  3. Python利用PyQt5制作一个获取网络实时数据NBA数据播报GUI

    现在NBA联赛也进行到半决赛了,我们怎么样才能以更快的方法获取NBA的数据呢?这里我们就自己来做一个数据播报的程序 文章目录 制作NBA数据爬虫 捋顺思路 编写代码 NBAReporter.py NB ...

  4. python数据分析之连接MySQL数据库并进行数据可视化

    大家好,我是带我去滑雪! 本期将熟悉MySQL数据库以及管理和操作MySQL数据库的数据库管理工具Navicat Premium,然后在python中调用MySQL数据库进行数据分析和数据可视化. 目 ...

  5. Python计算美国总统的身高并实现数据可视化

    Python计算美国总统的身高并实现数据可视化 代码如下: import numpy as np import pandas as pd import matplotlib.pyplot as plt ...

  6. Python+Flask实现全国、全球疫情大数据可视化(二):网页页面布局+echarts可视化中国地图、世界地图、柱状图和折线图

    文章目录 相关文章 一.实现效果 二.页面布局html+css main.html main.css 三.echarts图表制作 1.全国累计趋势折线图ec_l1.js 2.全国趋势变化折线图ec_l ...

  7. python爬取b站弹幕并进行数据可视化

    python爬取b站弹幕并进行数据可视化 1.第一步,爬取b站弹幕 我们随便打开一个b站视频 打开开发者模式,在network下搜索list,可以找到该视频的弹幕文件 打开之后是这个样子的 结构还是比 ...

  8. 利用itchat接口进行微信好友数据分析

    配置环境 python3 所需模块: itchat \ codecs \ json \ pyecharts \ collections \ jieba 主题思路 通过itchat登陆微信网页版,然后获 ...

  9. python利用itchat监控微信好友的头像是否更换(纯属娱乐)

    利用itchat模块可以模拟登录微信网页版,所以可以获取一些微信的基本信息,包括好友名字,数量,头像,群聊等等,也可模拟发送信息,所以写了一个监控好友头像是否改变,如果好友头像改变了,立马赞美ta的头 ...

最新文章

  1. 【Qt】通过QtCreator源码学习Qt(六):命令行参数解析实现
  2. Mysql默认密码的查找和修改
  3. Windows server2008 搭建ASP接口访问连接oracle数据库全过程记录--备用
  4. OpenvSwitch — 操作实践
  5. 过河卒(Noip2002)
  6. cocos2d-x 2.x版本使用uiwidget需要注意的几点
  7. iview给radio按钮组件加点击事件
  8. python捕获信号退出_Python捕获信号退出Python中的捕获Ctrl+C/SIGINT,优雅地退出多个进程,python,在,CtrlCSIGINT,并...
  9. 手机计算机的冷知识,重度手机控也未必知道的冷知识!现在智能手机都一个样?...
  10. VB如何判断文件正被占用/已被打开
  11. 无线充QI协议之TX与RX通讯方式篇
  12. java 求百分比_java中计算百分比
  13. 时间管理——永远做重要不紧急的事情
  14. 现实中的软件工程:如何快速迭代代码
  15. 留德APS审核 - 计算机科学与技术 - 2020北京英语审核 (一审通过)
  16. 码洞原创深度技术文章大全 —— 高端面试必备
  17. 江在川上曰:js中的JSON解析和序列化
  18. python调用百度AI接口实现人像分割
  19. iOS 语音读文字so easy
  20. 关于5G的NSA和SA,看完秒懂

热门文章

  1. 微信公众号开发之语音消息识别
  2. week9 B-东东学打牌
  3. 【每日新闻】孟天广:可利用大数据监测政商腐败,查出“白手套” | IDC:2017年第四季度全球企业存储市场增长13.7%
  4. 投影仪和电视哪个更适合家庭用?买当贝投影好么?
  5. aise TypeError(f“{method_name}: `{super_param.name}` must be present“)
  6. 亲缘进程、非亲缘进程-共享内存与信号
  7. 计算机网络(第八版 谢希仁著)(上)
  8. Selenium2Library库中没有系统关键字select window by handle咋办?
  9. 使用selenium抓取1688供应商
  10. Unity发布WebGL注意事项以及移动端打开webgl网页