微信小项目

一、用 python 进行微信好友分析

1、使用到的库

(1)wxpy:初始化微信机器人

(2)openpyxl:保存微信好友数据为Excel表格

(3) pyecharts:生成可视化的地图

(4)wordcloud、matplotlib、jieba:生成词云图

(5)echarts-china-provinces-pypkg:中国省级地图, echarts-china-cities-pypkg:中国城市地图

2、完整代码

#  导入模块
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(">>> 保存微信好友的信息成功!")

    '''====================== 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:\Windows\Fonts\simfang.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(">>> 词云生成!")
    
    '''===================== 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(">>> 获取全国好友分布图!")
    
    '''===================== 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(">>> 获取广东省好友分布图!")
        
    '''===================== 8. 自动执行函数 ====================='''
    def run(self):
        # 获取微信好友信息
        self.getFriendsInfo()
        print(">>> 获取微信好友的信息成功!")
        print(">>> 好友数量:", 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 = "E:/python实验/微信好友1.xlsx"      # 微信好友信息的Excel表格保存路径
    ToPictureFile = "E:/python实验/微信好友2.png"   # 微信好友信息city词云图保存路径
    ToMapFileProvince = "E:/python实验/微信好友3.html" # 微信好友信息province地图保存路径
    ToMapFileCity = "E:/python实验/微信好友4.html"  # 微信好友信息city地图保存路径
    # WeChatRobot对象实例化
    robot = WeChatRobot(ToExcelFile, ToPictureFile, ToMapFileProvince, ToMapFileCity)

3、结果如下:

(1)excel表

(2)词云图

 

(3)全国好友分布图

(4)广东省好友分布图

 

posted @ 2019-06-05 16:38    阅读(144)  评论(0编辑  收藏  举报