自己做一个小项目python_【Python】第一个微信小项目

一、微信好友数据分析功能介绍

1.爬取好友列表,显示好友昵称、性别和地域和签名, 文件保存为 xlsx 格式

2.统计好友的地域分布,并且做成词云和可视化展示在地图上

3.获取所有好友的头像,合并成一张大图

二、需要的库

1、Pyecharts:一个用于生成echarts图表的类库,echarts是百度开源的一个数据可视化库,用echarts生成的图可视化效果非常棒,使用pyechart库可以在python中生成echarts数据图。

2、Itchat:一个开源的微信个人号接口,使用python调用微信从未如此简单。

3、Jieba:简单的分词操作库。

4、Numpy:NumPy 系统是 Python 的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩 阵。

5、Pandas:pandas 是基于 NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

6、Pillow:图像处理。

7、wxpy:wxpy 在 itchat 的基础上,通过大量接口优化提升了模块的易用性,并进行丰富的功能 扩展。 (微信本身提供)

注:Pyecharts可能安装0.5.*的版本比较好

以上的三方库可以通过命令符(cmd)来实现安装,具体命令:pip install ***

另:可视化显示在地图上要安装地图数据包:

pip install echarts-china-provinces-pypkg

pip install echarts-countries-pypkg

三、运行环境:

使用 Anaconda 下的 spyder 编辑器。

三、分步操做

1、让程序登录微信,并获取我的好友相关信息。

from wxpy import * #导入模块

bot = Bot(cache_path=True) #初始化机器人,选择扫码登录

friend_all = bot.friends() #获取微信好友信息

运行登录代码会自动弹出一个二维码页面,打开如下图 1,用手机扫码同意后,进入微信

并获取微信好友的相关信息。

2、获取我的信息()

(1)利用交互式获取

in[2]:print(friend_all[0].raw)#friend_all[0]是我的微信昵称,.raw 则是获取我的全部信息

{'UserName': '@8c0c266b8a6e26de8ac633c1b8e9da89bc28c2b8f2ea97084f66518d2b5280ba', 'City': '', 'DisplayName': '', 'PYQuanPin': '', 'RemarkPYInitial': '', 'Province': '', 'KeyWord': '', 'RemarkName': '', 'PYInitial': '',

'EncryChatRoomId': '', 'Alias': '', 'Signature': '千帆过尽还是你',

'NickName': '杨宇平', 'RemarkPYQuanPin': '',

'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=1697661224&username=@8c0c266b8a6e26de8ac633c1b8e9da89bc28c2b8f2ea97084f66518d2b5280ba&skey=@crypt_35dd26c8_6e6d15d86316931db6d7bbb2bfe9b2e8',

'UniFriend': 0, 'Sex': 2, 'AppAccountFlag': 0, 'VerifyFlag': 0,

'ChatRoomId': 0, 'HideInputBarFlag': 0, 'AttrStatus': 0, 'SnsFlag': 1, 'MemberCount': 0, 'OwnerUin': 0, 'ContactFlag': 0, 'Uin': 548324490, 'StarFriend': 0, 'Statues': 0, 'MemberList': [], 'WebWxPluginSwitch': 0, 'HeadImgFlag': 1}

(2)文件式获取

(在原来的三行代码上加上最后一行即可)

from wxpy import *bot=Bot(cache_path=True)

friend_all=bot.friends()print(friend_all[0].raw)#friend_all[0]是我的微信昵称,.raw 则是获取我的全部信息

显示效果:

3、获取我的好友数量

(在原先的代码上加入此行即可,直接放在交互式,文件式都可以)

print(len(friend_all)) #好友的数量

结果:(显示博主177个好友)

4、把全部的好友信息转化为一个xlsx文件

获取好友信息

for a_friend infriend_all:

NickName= a_friend.raw.get('NickName', None)#昵称

#Sex = a_friend.raw.get('Sex', None)

Sex = {1: "男", 2: "女", 0: "其它"}.get(a_friend.raw.get('Sex', None), None)#性别(优化)

City = a_friend.raw.get('City', None)#城市

Province = a_friend.raw.get('Province', None)#省份

Signature = a_friend.raw.get('Signature', None)#个性签名

HeadImgUrl = a_friend.raw.get('HeadImgUrl', None)#头像地址

HeadImgFlag = a_friend.raw.get('HeadImgFlag', None)#小Flag

list_0=[NickName, Sex, City, Province, Signature, HeadImgUrl, HeadImgFlag]#存为一维数组

lis.append(list_0)#叠加数据

并存为xlsx文件

def lis2e17(filename,lis):#把数据存到表格中

importopenpyxl

wb=openpyxl.Workbook()

sheet=wb.active

sheet.title= 'list2excel17'file_name= filename +'.xlsx'title=['NickName','Sex','City','Province','Signature','HeadImgUrl','HeadImgFlag']for i inrange(0, len(lis)):for j inrange(0, len(lis[i])):

sheet.cell(row=i+1, column=j+1, value=str(lis[i][j]))

wb.save(file_name)print("写入数据成功!")print(lis2e17('yyp',lis))

结果:

5、把好友的地区用词云统计

(1)给原先的yyp.xlsl加上行标题,例如:nickname sex city province signature headImgUrl headImgFlag(因为下面的词云运用,要用到city索引,才能调用city那一列),另存为yyp_1.xlsx文件

#对数据进行初步探索#方法一#粗略获取好友的统计信息

Friends =bot.friends()

data= Friends.stats_text(total=True, sex=True,top_provinces=30, top_cities=500)print(data)from pandas importread_excel

df= read_excel('yyp_1.xlsx',sheetname='list2excel17') #把yyp.xlsx加上列标题行,另存为yyp_1.xlsx,读取新的表格

df.tail(5)

df.city.count()

df.city.describe()

#把好友信息(地区)统计,词云

from wordcloud importWordCloudimportmatplotlib.pyplot as pltimportpandas as pdfrom pandas importDataFrame

word_list= df['city'].fillna('0').tolist()#将 dataframe 的列转化为 list,其中的 nan 用“0”替换

new_text = ' '.join(word_list)

wordcloud= WordCloud(font_path='simhei.ttf', background_color="black").generate(new_text)#设计图背景颜色,字体

plt.imshow(wordcloud)

plt.axis("off")

plt.show()

(2)将词云图转为HTML的形

这需要用到pyecharts库的0.5版本,anaconde3原先的是1.0版本的,需要删了这个,安装0.5版本

代码实现如下:

#利用 pyechart 做词云

importpandas as pd#count = df.city.value_counts() #对 dataframe 进行全频率统计,排除了 nan

city_list = df['city'].fillna('NAN').tolist()#将 dataframe 的列转化为 list,其中的 nan 用“NAN” 替换

count_city = pd.value_counts(city_list)#对 list 进行全频率统计

from pyecharts.charts.wordcloud import WordCloud #设置对象

name =count_city.index.tolist()

value=count_city.tolist()

wordcloud= WordCloud(width=1300, height=620)

wordcloud.add("", name, value, word_size_range=[20, 100])

wordcloud.show_config()

wordcloud.render(r'D:\Python\wechatcloud.html')

效果如下:

6、把好友的地区转为地图形式

要加入模块 import pandas as pd 在添加下面代码

province_list = df['province'].fillna('NAN').tolist()#将 dataframe 的列转化为 list,其中的 nan 用 “NAN”替换

count_province =pd.value_counts(province_list)#对 list 进行全频率统计

from pyecharts importMap

value=count_province.tolist()

attr=count_province.index.tolist()

map=Map("各省微信好友分布", width=1300, height=700)

map.add("", attr, value, maptype='china', is_visualmap=True,visual_text_color='#000',is_label_show =True)#显示地图上的省份

map.show_config()

map.render(r'D:\Python\wechatProMap.html')

显示效果如下:

7、总代码:

#-*- coding: utf-8 -*-

"""Created on Sun Jun 2 23:38:29 2019

@author: yyp"""

from wxpy import *

import pandas as pd #地图那要用到的模块

bot=Bot(cache_path=True)

friend_all=bot.friends()print(friend_all[0].raw)#friend_all[0]是我的微信昵称,.raw 则是获取我的全部信息

a=len(friend_all)#输出好友个数

print(a)

lis=[]for a_friend infriend_all:

NickName= a_friend.raw.get('NickName',None)#Sex = a_friend.raw.get('Sex',None)

Sex ={1:"男",2:"女",0:"其它"}.get(a_friend.raw.get('Sex',None),None)

City= a_friend.raw.get('City',None)

Province= a_friend.raw.get('Province',None)

Signature= a_friend.raw.get('Signature',None)

HeadImgUrl= a_friend.raw.get('HeadImgUrl',None)

HeadImgFlag= a_friend.raw.get('HeadImgFlag',None)

list_0=[NickName,Sex,City,Province,Signature,HeadImgUrl,HeadImgFlag]

lis.append(list_0)def lis2e17(filename,lis):#把数据存到表格中

importopenpyxl

wb=openpyxl.Workbook()

sheet=wb.active

sheet.title= 'list2excel17'file_name= filename +'.xlsx'title=['NickName','Sex','City','Province','Signature','HeadImgUrl','HeadImgFlag']for i inrange(0, len(lis)):for j inrange(0, len(lis[i])):

sheet.cell(row=i+1, column=j+1, value=str(lis[i][j]))

wb.save(file_name)print("写入数据成功!")print(lis2e17('yyp',lis))#对数据进行初步探索#方法一#粗略获取好友的统计信息#另存文件

Friends =bot.friends()

data= Friends.stats_text(total=True, sex=True,top_provinces=30, top_cities=500)print(data)from pandas importread_excel

df= read_excel('yyp_1.xlsx',sheetname='list2excel17') #把yyp.xlsx加上列标题行,另存为yyp_1.xlsx,读取新的表格

df.tail(5)

df.city.count()

df.city.describe()'''#把好友信息(籍贯)统计,词云(常规)

from wordcloud import WordCloud

import matplotlib.pyplot as plt

import pandas as pd

from pandas import DataFrame

word_list= df['city'].fillna('0').tolist()

#将 dataframe 的列转化为 list,其中的 nan 用“0”替换

new_text = ' '.join(word_list)

wordcloud = WordCloud(font_path='simhei.ttf', background_color="black").generate(new_text)

#设计图背景颜色,字体

plt.imshow(wordcloud)

plt.axis("off")

plt.show()'''

'''#利用 pyechart 做词云(以HTML的形式显示)

import pandas as pd

#count = df.city.value_counts() #对 dataframe 进行全频率统计,排除了 nan

city_list = df['city'].fillna('NAN').tolist()#将 dataframe 的列转化为 list,其中的 nan 用“NAN” 替换

count_city = pd.value_counts(city_list)#对 list 进行全频率统计

from pyecharts.charts.wordcloud import WordCloud #设置对象

name = count_city.index.tolist()

value = count_city.tolist()

wordcloud = WordCloud(width=1300, height=620)

wordcloud.add("", name, value, word_size_range=[20, 100])

wordcloud.show_config()

wordcloud.render(r'D:\Python\wechatcloud.html')'''

#把好友的地区显示在地图上(以地图的形式呈现)

province_list = df['province'].fillna('NAN').tolist()#将 dataframe 的列转化为 list,其中的 nan 用 “NAN”替换

count_province = pd.value_counts(province_list)#对 list 进行全频率统计

from pyecharts importMap

value=count_province.tolist()

attr=count_province.index.tolist()

map=Map("各省微信好友分布", width=1300, height=700)

map.add("", attr, value, maptype='china', is_visualmap=True,visual_text_color='#000',is_label_show = True)#显示地图上的省份

map.show_config()

map.render(r'D:\Python\wechatProMap.html')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RISC-V的自定义CPU悖论

来源:内容编译自「eejournal」,谢谢。随着这些年的发展,RISC-V的受重视程度与与日俱增。这主要因为它是免费的、灵活的,并且速度很快。这使RISC-V成为许多开发人员的安全便捷选择。但是您会认为RISC-V是通用RISC处理器还是定制的随…

java计算加速减速_Javascript加速运动与减速运动

加速运动,即一个物体运动时速度越来越快;减速运动,即一个物体运动时速度越来越慢。现在用Javascript来模拟这两个效果,原理就是用setInterval或setTimeout动态改变一个元素与另外一个元素的距离,如xxx.style.left或xxx…

python 运维包_基础入门_Python-模块和包.运维开发中__import__动态导入最佳实践?

常规导入:import module_name[,module1,...]from module_name import [*|child[,child1,...]from module_name import [*|child[,child1,...] as alias_name注意: 导入语句可出现在程序任意位置,自定义包要实现from module_name import *的效果则此模块必须在__init__.py实现__…

华为宣布出售荣耀,声明来了

来源:澎湃新闻综合华为官网、《深圳特区报》今天,华为发表声明,整体出售荣耀业务资产。对于交割后的荣耀,华为不占有任何股份,也不参与经营管理与决策。11月17日一早,荣耀最终的出售方案公布。多家企业在《…

Node.js教程-mysql模块

概述 在Node.js中,mysql模块是实现MySQL协议的JavaScript客户端工具。Node.js程序通过与MySQL建立链接,然后可对数据进行增、删、改、查等操作。 安装 由于mysql模块不是Node.js内置模块,需手动安装 npm i mysql注意:若MySQL服…

java 几种引用类型_Java 四种引用类型总结-Fun言

1. Java引用介绍Java从1.2版本开始引入了4种引用,这4种引用的级别由高到低依次为:强引用 > 软引用 > 弱引用 > 虚引用⑴ 强引用(Strong Reference)强引用是使用最普遍的引用,也是赋值的默认引用。如果一个对象具有强引用&…

JS运算符类型

一、运算符类型 1、算术运算符&#xff1a;用于各类数值运算&#xff0c;包括加()、减(-)、乘(*)、除(/)、求余(或称模运算&#xff0c;%)、自增()、自减(--)共七种。2、关系运算符&#xff1a;用于比较运算。包括大于&#xff08;>&#xff09;、小于&#xff08;<&…

python关于字符串的内置函数_Python 字符串内置函数(二)

# 2.格式化相关# ljust(width) 函数 获取固定长度&#xff0c;左对齐&#xff0c;右边不够用空格补齐# rjust(width) 函数 获取固定长度&#xff0c;右对齐&#xff0c;左边不够用空格补齐# center(width) 函数 获取固定长度&#xff0c;中间对齐&#xff0c;两边不够用空格补齐…

边缘计算4.0正急速驶来,你做好准备了吗?

物联网智库 整理发布导 读近十年间&#xff0c;各行各业的企业都经历着数字化技术和产品对传统生产经营模式的冲击。人工智能、大数据、区块链、自动化等技术的日渐完善&#xff0c;让企业的生产效率和业务模式发生了翻天覆地的变化。

java中for的常规用法_Java for循环的几种用法详解

本文非常适合初学Java的程序员&#xff0c;主要是来了解一下Java中的几种for循环用法&#xff0c;分析得十分详细&#xff0c;一起来看看。J2SE 1.5提供了另一种形式的for循环。借助这种形式的for循环&#xff0c;可以用更简单地方式来遍历数组和Collection等类型的对象。本文介…

运维-替换-修改kibana徽标

作为一名纯运维人员&#xff0c;想更改kibana的徽标。 并不能像开发一样去看源码并修改源码。 所以我们可以替换徽标。 先来一个效果图。我的版本是5.5.1。 具体的修改过程&#xff1a; 在kibana安装路径下面。 optimize/bundles/ 0cebf3d61338c454670b1c5bdf5d6d8d.svg 这…

python中的变量的作用_Python中的变量作用域

python中变量作用域包括&#xff1a;L (Local) 局部作用域&#xff0c;函数内部声明但没有使用global的变量E (Enclosing) 闭包函数外的函数中&#xff0c;def或者lambda的本地作用域G (Global) 全局作用域&#xff0c;函数中使用global声明的变量或在模块层声明的变量B (Built…

欧拉公式——真正的宇宙第一公式

来源&#xff1a;数学中国欧拉公式是数学里最令人着迷的公式之一&#xff0c;它将数学里最重要的几个常数联系到了一起&#xff1a;两个超越数&#xff1a;自然对数的底e&#xff0c;圆周率π&#xff1b;两个单位&#xff1a;虚数单位i和自然数的单位1&#xff0c;以及数学里常…

SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件

我们这一一篇博客讲的是如何整合Springboot和Mybatis框架&#xff0c;然后使用generator自动生成mapper&#xff0c;pojo等文件。然后再使用阿里巴巴提供的开源连接池druid&#xff0c;这个连接池的好处我就不说了&#xff0c;集合了所有连接池的好处&#xff0c;并且还提供了监…

python提取部分字符串三参数_python3 字符串属性(三)

maketrans 和 translate的用法(配合使用)下面是python的英文用法解释maketrans(x, yNone, zNone, /)Return a translation table usable for str.translate().If there is only one argument, it must be a dictionary mapping Unicodeordinals (integers) or characters to Un…

java实现qq抢红包_Java实现抢红包功用

用多线程模仿多人一起抢红包。服务端将玩家发出的红包保存在一个行列里&#xff0c;然后用Job守时将红包信息推送给玩家。每一批玩家的抢红包恳求&#xff0c;其实操作的都是从行列中弹出的第一个红包元素&#xff0c;但当时的红包数量为空的时分&#xff0c;主动弹出下一个红包…

芯片里面100多亿个晶体管是如何安装上去的?

来源&#xff1a;金属加工如今随着芯片制程的不断提升&#xff0c;芯片中可以有100多亿个晶体管&#xff0c;如此之多的晶体管&#xff0c;究竟是如何安上去的呢&#xff1f;1当芯片被不停地放大&#xff0c;里面宛如一座巨大的城市。这是一个Top-down View 的SEM照片&#xff…

[CEOI2008] order

题目描述 有N个工作&#xff0c;M种机器&#xff0c;每种机器你可以租或者买过来. 每个工作包括若干道工序&#xff0c;每道工序需要某种机器来完成,你可以通过购买或租用机器来完成。 现在给出这些参数&#xff0c;求最大利润 输入输出格式 输入格式&#xff1a; 第一行给出 N…

response.end后抛了异常_(七)异常处理

(七)异常处理异常异常的体系结构java.lang.Throwable|-----java.lang.Error&#xff1a;一般不便携针对性的代码进行处理|-----java.lang.Exception&#xff1a;可以进行异常的处理|-----编译时异常&#xff08;checked|-----IOException|-----FileNotFoundException|-----Clas…

java xy x y_为什么该语句在Java中不起作用x ^ = y ^ = x ^ = y;

小编典典您的陈述大致相当于这种扩展形式&#xff1a;x x ^ (y y ^ (x x ^ y));与C语言不同&#xff0c;在Java中&#xff0c;保证二进制运算符的左操作数在右操作数之前进行求值。评估如下&#xff1a;x x ^ (y y ^ (x x ^ y))x 1 ^ (y 2 ^ (x 1 ^ 2))x 1 ^ (y 2 ^…