zoukankan      html  css  js  c++  java
  • 大学排名

    1. 使用到的库

    ① wxpy:初始化微信机器人

    ② openpyxl:保存微信好友数据为Excel表格

    ③ pyecharts:生成可视化的地图

    ④ wordcloud、matplotlib、jieba:生成词云图

    特别提醒】:pyecharts 库用的是0.5.x版本,而在 pip 中安装的为1.x.x版本,因此需要自行到【官网】中下载。

    2. 基本功能

    ① 分析微信好友数据

    ② 生成词云图

    ③ 生成地图展示

    3. 代码实现

    此处使用类来实现

    (1) 导入模块

    复制代码
    1 #  导入模块
    2 from wxpy import Bot
    3 import openpyxl
    4 from pyecharts import Map
    5 from wordcloud import WordCloud
    6 import matplotlib.pyplot as plt
    7 import jieba
    复制代码

    (2) 初始化机器人和获取微信好友的源信息

    此处调用 Bot() 方法,需要扫码登陆微信网页版,后续操作才能进行。

    复制代码
     1 def __init__(self, ToExcelFile="", ToCityFile="", ToMapProvinceFile="", ToMapCityFile=""):
     2     ''' 初始化机器人和其他参数 '''
     3     # 初始化机器人,需要扫码
     4     self.bot = Bot()
     5     # 获取我所有的微信好友信息 - 存储基础信息(未处理)
     6     self.allFriends_Info = self.bot.friends()
     7     # 我的微信好友个数
     8     self.allFriends_Num = len(self.allFriends_Info)
     9     # 保存微信好友信息的表格文件路径(.xlsx)
    10     self.ExcelFile = ToExcelFile
    11     # 保存城市词云图的文件路径(.png/.jpg)
    12     self.WCOfCityFile = ToCityFile
    13     # 保存省份地图的文件路径(.html)
    14     self.MapProvinceFile = ToMapProvinceFile
    15     # 其他可用参数
    16     self.MapCityFile = ToMapCityFile
    17     # 自动调用run方法,使得在实例化对象后自动运行其他函数
    18     self.run()
    复制代码

    (3) 统计和处理微信好友的信息

    除了列出的还有 个性签名、头像其他属性。

    复制代码
     1 def getFriendsInfo(self):
     2     ''' 获取微信好友的全部信息 '''
     3     # 存储微信好友的信息(经过信息处理的)
     4     self.friendsInfo = []
     5     # 定义列标题
     6     self.infoTitle = ['NickName', 'RemarkName', 'Sex', 'Province', 'City']
     7     for aFriend in self.allFriends_Info:
     8         # 获取昵称
     9         NickName = aFriend.raw.get(self.infoTitle[0], None)
    10         # 获取备注
    11         RemarkName = aFriend.raw.get(self.infoTitle[1], None)
    12         # 获取性别
    13         Sex = {1:"男", 2:"女", 0:"其他"}.get(aFriend.raw.get(self.infoTitle[2], None), None)
    14         # 获取省份
    15         Province = aFriend.raw.get(self.infoTitle[3], None)
    16         # 获取城市
    17         City = aFriend.raw.get(self.infoTitle[4], None)
    18         lisTmp = [NickName, RemarkName, Sex, Province, City]
    19         self.friendsInfo.append(lisTmp)
    复制代码

    (4) 保存微信好友的信息

    在这保存为Excel表格,在代码中插入表头行,为了便于阅读。

    复制代码
     1 def saveFriendsInfoAsExcel(self, ExcelName):
     2     ''' 保存微信好友的信息到 Excel 表格中 '''
     3     # 生成openpyxl对象
     4     workbook = openpyxl.Workbook()
     5     # 激活表格
     6     sheet = workbook.active
     7     # 设置表格标题
     8     sheet.title = 'WeChatFriendsInfo'
     9     # 填充列标题到第一行
    10     for _ in range(len(self.infoTitle)):
    11         sheet.cell(row=1, column=_+1, value=self.infoTitle[_])
    12     # 填充微信好友信息,从第二行开始
    13     for i in range(self.allFriends_Num):
    14         for j in range(len(self.infoTitle)):
    15             sheet.cell(row=i+2, column=j+1, value=str(self.friendsInfo[i][j]))
    16     # 若文件名非空,则保存到该路径下
    17     if ExcelName != "":
    18         workbook.save(ExcelName)
    19         print(">>> Save WeChat friends' information successfully!")
    复制代码

    (5) 分析微信好友的信息

    1 def quiteAnalyzeFriendsInfo(self):
    2     ''' 分析数据,一步到位,直接了当 '''
    3     print(self.allFriends_Info.stats_text())

    (6) 生成city词云图

    复制代码
     1 def creatWordCloudOfCity(self, CityName):
     2     ''' 使用获取的数据生成city词云图 '''
     3     # 获取所有的城市
     4     cityStr = ""
     5     for i in range(self.allFriends_Num):
     6         if self.friendsInfo[i][4] not in cityStr:
     7             cityStr += " " + self.friendsInfo[i][4]
     8     #jieba库精确模式分词
     9     wordlist = jieba.lcut(cityStr)
    10     cityStr = ' '.join(wordlist)
    11     # 加载背景图片
    12     #cloud_mask = np.array(Image.open(BackGroundFile))
    13     #设置词云图属性
    14     font = r'C:WindowsFontssimfang.ttf' # 设置字体路径
    15     wc = WordCloud(
    16         background_color = 'black',     # 背景颜色
    17         #mask = cloud_mask,             # 背景图片
    18         max_words = 100,                # 设置最大显示的词云数
    19         font_path = font,               # 设置字体形式(在本机系统中)
    20         height = 300,                   # 图片高度
    21         width = 600,                    # 图片宽度
    22         max_font_size = 100,            # 字体最大值
    23         random_state = 100,             # 配色方案的种类
    24         )
    25     # 生成词云图
    26     myword = wc.generate(cityStr)
    27     #展示词云图
    28     plt.imshow(myword)
    29     plt.axis('off')
    30     plt.show()
    31     # 若文件名非空,则保存到该路径下
    32     if CityName != "":
    33         #保存词云图
    34         wc.to_file(CityName)
    35         print(">>> Creat WeChat wordcloud of city successfully!")
    复制代码

    (7) 生成province地图

    复制代码
     1 def creatMapProvince(self, MapFile):
     2     ''' 使用获取的数据生成province地图 '''
     3     # 获取所有省份
     4     provinceList, provinceNum = [], []
     5     for i in range(self.allFriends_Num):
     6         if self.friendsInfo[i][3] not in provinceList:
     7             provinceList.append(self.friendsInfo[i][3])
     8             provinceNum.append(0)
     9     for i in range(self.allFriends_Num):
    10         for j in range(len(provinceList)):
    11             if self.friendsInfo[i][3] == provinceList[j]:
    12                 provinceNum[j] += 1
    13     # 生成 Map
    14     map = Map("各省微信好友分布", width=1000, height=800)
    15     map.add("", provinceList, provinceNum, maptype="china", is_visualmap=True, visual_text_color='#000')
    16     # 若文件名非空,则保存到该路径下
    17     if MapFile != "":
    18         map.render(MapFile)
    19         print(">>> Creat WeChat Map of Provinces seccessfully!")
    复制代码

    (8) 生成city地图

    复制代码
     1 def creatMapCity(self, MapFile):
     2         ''' 使用获取的数据生成city地图 '''
     3         # 获取所有省份
     4         CityList, CityNum = [], []
     5         for i in range(self.allFriends_Num):
     6             if self.friendsInfo[i][4] not in CityList:
     7                 CityList.append(self.friendsInfo[i][4])
     8                 CityNum.append(0)
     9         for i in range(self.allFriends_Num):
    10             for j in range(len(CityList)):
    11                 if self.friendsInfo[i][4] == CityList[j]:
    12                     CityNum[j] += 1
    13         for i in range(len(CityList)):
    14             CityList[i] += '市'
    15         # 生成 Map
    16         map = Map("各市微信好友分布", width=1000, height=800)
    17         map.add("", CityList, CityNum, maptype="广东", is_visualmap=True, visual_text_color='#000')
    18         # 若文件名非空,则保存到该路径下
    19         if MapFile != "":
    20             map.render(MapFile)
    21             print(">>> Creat WeChat Map of Cities seccessfully!")
    复制代码

    有了上述实现各个功能的方法,那么就差一个调用各种方法的方法了。

    (9) run方法

    复制代码
     1 def run(self):
     2     # 获取微信好友信息
     3     self.getFriendsInfo()
     4     print(">>> Get WeChat friends' information successfully!")
     5     print(">>> Members:", self.allFriends_Num)
     6     # 保存微信好友信息
     7     self.saveFriendsInfoAsExcel(self.ExcelFile)
     8     # 分析微信好友信息
     9     self.quiteAnalyzeFriendsInfo()
    10     # 使用微信好友的 city 产生词云图
    11     self.creatWordCloudOfCity(self.WCOfCityFile)
    12     # 生成微信好友的 province 地图
    13     self.creatMapProvince(self.MapProvinceFile)
    14     # 生成微信好友的 city 地图
    15     self.creatMapCity(self.MapCityFile)
    复制代码

    对于文件路径,在main函数中传递即可。【注】:上述代码都在类中,在此处结束,下面为main函数

    复制代码
    1 if __name__ == "__main__":
    2     ToExcelFile = "./WeChatAnalyze//FriendsInfo.xlsx"      # 微信好友信息的Excel表格保存路径
    3     ToPictureFile = "./WeChatAnalyze//CityWordCloud.png"   # 微信好友信息city词云图保存路径
    4     ToMapFileProvince = "./WeChatAnalyze//WeChatProvinceMap.html" # 微信好友信息province地图保存路径
    5     ToMapFileCity = "./WeChatAnalyze//WeChatCityMap.html"  # 微信好友信息city地图保存路径
    6     # WeChatRobot对象实例化
    7     robot = WeChatRobot(ToExcelFile, ToPictureFile, ToMapFileProvince, ToMapFileCity)
    复制代码

    是不是觉得Main函数很简短,哈哈,没错,就是这么简!

    接下来看看实现的效果吧!

    >>> 这个是终端显示效果

    >>> 这个是保存为Excel表格的内容

     >>> 这个是微信好友各省的分布

    >>> 这个是微信好友各市的分布

    OK. 今天就分享到这啦!最后附上完整代码!

    参考文献:

    ① 用python玩微信:https://segmentfault.com/a/1190000014203617

    ② pyecharts 中部分import 不到:https://blog.csdn.net/weixin_38617311/article/details/81146748

    ③ pyecharts 中地图显示不全:https://blog.csdn.net/xiamoyanyulrq/article/details/80025105

    # -*- coding: utf-8 -*-
    '''
    This is a program which can analyze datas of WeChat friends.
    @author: bpf
    '''
    #  导入模块
    from wxpy import Bot
    import openpyxl
    from pyecharts import Map
    from wordcloud import WordCloud
    import matplotlib.pyplot as plt
    import jieba
    class WeChatRobot:
        '''====================== 1. 获取微信好友信息 ======================'''
        def __init__(self, ToExcelFile="", ToCityFile="", ToMapProvinceFile="", ToMapCityFile=""):
            ''' 初始化机器人和其他参数 '''
            # 初始化机器人,需要扫码
            self.bot = Bot()
            # 获取我所有的微信好友信息 - 存储基础信息(未处理)
            self.allFriends_Info = self.bot.friends()
            # 我的微信好友个数
            self.allFriends_Num = len(self.allFriends_Info)
            # 保存微信好友信息的表格文件路径(.xlsx)
            self.ExcelFile = ToExcelFile
            # 保存城市词云图的文件路径(.png/.jpg)
            self.WCOfCityFile = ToCityFile
            # 保存省份地图的文件路径(.html)
            self.MapProvinceFile = ToMapProvinceFile
            # 其他可用参数
            self.MapCityFile = ToMapCityFile
            # 自动调用run方法,使得在实例化对象后自动运行其他函数
            self.run()
        '''====================== 2. 统计微信好友信息 ======================'''
        def getFriendsInfo(self):
            ''' 获取微信好友的全部信息 '''
            # 存储微信好友的信息(经过信息处理的)
            self.friendsInfo = []
            # 定义列标题
            self.infoTitle = ['NickName', 'RemarkName', 'Sex', 'Province', 'City']
            for aFriend in self.allFriends_Info:
                # 获取昵称
                NickName = aFriend.raw.get(self.infoTitle[0], None)
                # 获取备注
                RemarkName = aFriend.raw.get(self.infoTitle[1], None)
                # 获取性别
                Sex = {1:"男", 2:"女", 0:"其他"}.get(aFriend.raw.get(self.infoTitle[2], None), None)
                # 获取省份
                Province = aFriend.raw.get(self.infoTitle[3], None)
                # 获取城市
                City = aFriend.raw.get(self.infoTitle[4], None)
                lisTmp = [NickName, RemarkName, Sex, Province, City]
                self.friendsInfo.append(lisTmp)
       
        '''====================== 3. 保存微信好友信息 ======================'''
        def saveFriendsInfoAsExcel(self, ExcelName):
            ''' 保存微信好友的信息到 Excel 表格中 '''
            # 生成openpyxl对象
            workbook = openpyxl.Workbook()
            # 激活表格
            sheet = workbook.active
            # 设置表格标题
            sheet.title = 'WeChatFriendsInfo'
            # 填充列标题到第一行
            for _ in range(len(self.infoTitle)):
                sheet.cell(row=1, column=_+1, value=self.infoTitle[_])
            # 填充微信好友信息,从第二行开始
            for i in range(self.allFriends_Num):
                for j in range(len(self.infoTitle)):
                    sheet.cell(row=i+2, column=j+1, value=str(self.friendsInfo[i][j]))
            # 若文件名非空,则保存到该路径下
            if ExcelName != "":
                workbook.save(ExcelName)
                print(">>> Save WeChat friends' information successfully!")
        '''====================== 4. 分析微信好友信息 ======================'''
        def quiteAnalyzeFriendsInfo(self):
            ''' 分析数据,一步到位,直接了当 '''
            print(self.allFriends_Info.stats_text())
       
        '''====================== 5. 产生city词云图 ======================'''
        def creatWordCloudOfCity(self, CityName):
            ''' 使用获取的数据生成city词云图 '''
            # 获取所有的城市
            cityStr = ""
            for i in range(self.allFriends_Num):
                if self.friendsInfo[i][4] not in cityStr:
                    cityStr += " " + self.friendsInfo[i][4]
            #jieba库精确模式分词
            wordlist = jieba.lcut(cityStr)
            cityStr = ' '.join(wordlist)
            # 加载背景图片
            #cloud_mask = np.array(Image.open(BackGroundFile))
            #设置词云图属性
            font = r'C:WindowsFontssimfang.ttf' # 设置字体路径
            wc = WordCloud(
                background_color = 'black',     # 背景颜色
                #mask = cloud_mask,             # 背景图片
                max_words = 100,                # 设置最大显示的词云数
                font_path = font,               # 设置字体形式(在本机系统中)
                height = 300,                   # 图片高度
                width = 600,                    # 图片宽度
                max_font_size = 100,            # 字体最大值
                random_state = 100,             # 配色方案的种类
                )
            # 生成词云图
            myword = wc.generate(cityStr)
            #展示词云图
            plt.imshow(myword)
            plt.axis('off')
            plt.show()
            # 若文件名非空,则保存到该路径下
            if CityName != "":
                #保存词云图
                wc.to_file(CityName)
                print(">>> Creat WeChat wordcloud of city successfully!")
       
        '''===================== 6. 产生province地图 ====================='''
        def creatMapProvince(self, MapFile):
            ''' 使用获取的数据生成province地图 '''
            # 获取所有省份
            provinceList, provinceNum = [], []
            for i in range(self.allFriends_Num):
                if self.friendsInfo[i][3] not in provinceList:
                    provinceList.append(self.friendsInfo[i][3])
                    provinceNum.append(0)
            for i in range(self.allFriends_Num):
                for j in range(len(provinceList)):
                    if self.friendsInfo[i][3] == provinceList[j]:
                        provinceNum[j] += 1
            # 生成 Map
            map = Map("各省微信好友分布", width=1000, height=800)
            map.add("", provinceList, provinceNum, maptype="china", is_visualmap=True, visual_text_color='#000')
            # 若文件名非空,则保存到该路径下
            if MapFile != "":
                #map.show_config()
                map.render(MapFile)
                print(">>> Creat WeChat Map of Provinces seccessfully!")
       
        '''===================== 7. 产生city地图 ====================='''
        def creatMapCity(self, MapFile):
            ''' 使用获取的数据生成city地图 '''
            # 获取所有省份
            CityList, CityNum = [], []
            for i in range(self.allFriends_Num):
                if self.friendsInfo[i][4] not in CityList:
                    CityList.append(self.friendsInfo[i][4])
                    CityNum.append(0)
            for i in range(self.allFriends_Num):
                for j in range(len(CityList)):
                    if self.friendsInfo[i][4] == CityList[j]:
                        CityNum[j] += 1
            for i in range(len(CityList)):
                CityList[i] += '市'
            # 生成 Map
            map = Map("各市微信好友分布", width=1000, height=800)
            map.add("", CityList, CityNum, maptype="广东", is_visualmap=True, visual_text_color='#000')
            # 若文件名非空,则保存到该路径下
            if MapFile != "":
                map.render(MapFile)
                print(">>> Creat WeChat Map of Cities seccessfully!")
           
        '''===================== 8. 自动执行函数 ====================='''
        def run(self):
            # 获取微信好友信息
            self.getFriendsInfo()
            print(">>> Get WeChat friends' information successfully!")
            print(">>> Members:", self.allFriends_Num)
            # 保存微信好友信息
            self.saveFriendsInfoAsExcel(self.ExcelFile)
            # 分析微信好友信息
            self.quiteAnalyzeFriendsInfo()
            # 使用微信好友的 city 产生词云图
            self.creatWordCloudOfCity(self.WCOfCityFile)
            # 生成微信好友的 province 地图
            self.creatMapProvince(self.MapProvinceFile)
            # 生成微信好友的 city 地图
            self.creatMapCity(self.MapCityFile)
           
    if __name__ == "__main__":
        ToExcelFile = "./WeChatAnalyze//FriendsInfo.xlsx"      # 微信好友信息的Excel表格保存路径
        ToPictureFile = "./WeChatAnalyze//CityWordCloud.png"   # 微信好友信息city词云图保存路径
        ToMapFileProvince = "./WeChatAnalyze//WeChatProvinceMap.html" # 微信好友信息province地图保存路径
        ToMapFileCity = "./WeChatAnalyze//WeChatCityMap.html"  # 微信好友信息city地图保存路径
        # WeChatRobot对象实例化
        robot = WeChatRobot(ToExcelFile, ToPictureFile, ToMapFileProvince, ToMapFileCity)
  • 相关阅读:
    LeetCode Merge Two Sorted Lists 归并排序
    LeetCode Add Binary 两个二进制数相加
    LeetCode Climbing Stairs 爬楼梯
    034 Search for a Range 搜索范围
    033 Search in Rotated Sorted Array 搜索旋转排序数组
    032 Longest Valid Parentheses 最长有效括号
    031 Next Permutation 下一个排列
    030 Substring with Concatenation of All Words 与所有单词相关联的字串
    029 Divide Two Integers 两数相除
    028 Implement strStr() 实现 strStr()
  • 原文地址:https://www.cnblogs.com/luorunsb/p/10968775.html
Copyright © 2011-2022 走看看