zoukankan      html  css  js  c++  java
  • 第一个微信小项目

    一、微信好友分析

    •    本次操作所需要的库:wxpy

                   pyecharts

                   wordcloud

                   numpy

                   PIL

                   matplotlib

                   pandas

    列举出来的库可能有遗漏,在测试过程中如果缺少必要的库会提示,此时再安装,缺啥补啥。

    安装方式同样是打开命令行窗口,输入"pip install name"(其中name为所需安装的库名称)。

    有的同学可能是使用Anaconda编写程序,那么要打开的就不是命令行窗口了,而是跟Anaconda在同一目录的"Anaconda Prompt",见下图:

    同样的也是输入"pip install name"(name为所要安装的库的名称)

    •     代码分解:

    1.获取好友信息

    def get_friends_info(self): #获取好像信息,返回lis列表
      bot = Bot()
      lis = [['昵称', '备注名称', '性别', '城市', '省份', '个人签名']]  # 把信息存储为一个二维列表,添加头部信息
      friend_all = bot.friends()
    
      for a_friend in friend_all:
        NickName = a_friend.raw.get('NickName', None) #获取所有好友信息 raw表示获取全部信息
        RemarkName = a_friend.raw.get('RemarkName', 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, RemarkName, Sex, City, Province, Signature]
        lis.append(list_0)
      return lis
    

    2.将好友信息输入excel表格

    def friends_info_lis_to_excle(self):
      import openpyxl
      lis = self.get_friends_info()
      wb = openpyxl.Workbook()   sheet = wb.active   sheet.title = self.sheetname   for i in range(0, len(lis)):     for j in range(0, len(lis[i])):       sheet.cell(row=i+1, column=j+1, value=str(lis[i][j]))   wb.save(self.filename)   print("excel保存成功")

    3.创建字典供词云使用

    def extract_data_as_two_lis(self, condition):
      df = read_excel(self.filename, sheet_name=self.sheetname)
      X_list = df[condition].fillna('未知').tolist()  # 把列转换为list,用'未知'替换Nan?
      counts = {}  # 创建字典
      for word in X_list:
        counts[word] = counts.get(word, 0) + 1  # 统计词频
      items = list(counts.items())  # 返回所有键值对
      items.sort(key=lambda x: x[1], reverse=True)  # 降序排序
      keylist = list()
      valueslist = list()
      for item in items:
        word, count = item
        #if word == '0':
          #word = "未知"
        keylist.append(word)  # 把词语降序word放进一个列表
        valueslist.append(count)
      return keylist, valueslist
    

    4.制作词云

    def city_wordcloud(self, save_name, condition):
            wordlist, giveup = self.extract_data_as_two_lis(condition)
            new_wordlist = list()
            for i in range(25):
                new_wordlist.append(wordlist[i])
            wl = ' '.join(wordlist)  # 把列表转换成str wl为str类型,所以需要转换
            cloud_mask = np.array(Image.open("love.jpg"))  # 词云的背景图,需要颜色区分度高
            wc = WordCloud(
                background_color="black",  # 背景颜色
                mask=cloud_mask,  # 背景图cloud_mask
                max_words=100,  # 最大词语数目
                font_path='simfang.ttf',  # 调用font里的simfang.tff字体
                height=500,  # 设置高度
                width=2600,  # 设置宽度
                max_font_size=1000,  # 最大字体号
                random_state=1000,  # 设置随机生成状态,即有多少种配色方案
            )
            myword = wc.generate(wl)  # 用 wl的词语 生成词云
            # 展示词云图
            plt.imshow(myword)
            plt.axis("off")
            #plt.show()
            try:
                wc.to_file(save_name + '.jpg')  # 把词云保存下当前目录(与此py文件目录相同)
            except:
                print("词云保存失败")
    

    5.生成html柱状图

    def pillar_picture(self, condition, render_name):
            from pyecharts.charts import Bar
            from pyecharts.globals import ThemeType
            from pyecharts import options as opts
    
            keylist, valueslist = self.extract_data_as_two_lis(condition)
            new_keylist = list()
            new_valueslist = list()
            for i in range(10):
                new_keylist.append(keylist[i])
                new_valueslist.append(valueslist[i])
            bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
            # x轴 列表
            bar.add_xaxis(new_keylist)
            bar.add_yaxis("好友分布", new_valueslist)
            # render 会生成本地 HTML 文件,默认会在当前目录生成 城市分布柱状图.html 文件
            # 也可以传入路径参数,如 bar.render("mycharts.html")
            bar.render(render_name)
            print("pillar_picture图片保存成功!")
    

    6.生成城市分布图

    def map_picture(self, condition, picture_name, keylist, valueslist, Map_condition):
            from pyecharts import options as opts
            from pyecharts.charts import Map
    

      

    def map_visualmap() -> Map:
      new_keylist = list()
      new_valueslist = list()
      if condition == '城市':
        for i in range(len(keylist)):
          # 列表处理,默认elsx里面的city没有'市'字,地图需要市字
          new_keylist.append(keylist[i] + '市')
          new_valueslist.append(valueslist[i])
      else:
        for i in range(len(keylist)):
          new_keylist.append(keylist[i])
          new_valueslist.append(valueslist[i])
    
          c = (
             Map()
                        .add("好友地图分布", [list(z) for z in zip(new_keylist, new_valueslist)], Map_condition)
                        .set_global_opts(
                        title_opts=opts.TitleOpts(title="Map-VisualMap"),
                        visualmap_opts=opts.VisualMapOpts(max_=100),
                    )
              )
          try:
            c.render(picture_name)
          except:
              print("html地图图片创建失败")
          print('html地图图片保存成功')
        map_visualmap()#调用自己
    
    def find_friends_in_condition(self, condition):
            df = pd.read_excel(self.filename, usecols=[0, 1, 3], names=None)  #不要列名
            df_li = df.values.tolist()
            name = list()
            for data in df_li:
                condition = condition
                if condition in data:
                    name.append(data)
            self.map_picture()
            #print(len(name), name)
            return name
    

      

    •    代码汇总:

    # -*- coding: utf-8 -*-
    """
    Created on Sun Jun  2 20:31:17 2019
    
    @author: Regan_White_Lin       12
    """
    
    from wxpy import *
    from wordcloud import WordCloud
    import numpy as np
    from PIL import Image
    import matplotlib.pyplot as plt
    from pandas import read_excel
    import pandas as pd
    
    class  wechat_test():
    
        def __init__(self, filename, sheetname):
            self.filename = filename
            self.sheetname = sheetname
    
        def get_friends_info(self): #获取好像信息,返回lis列表
            bot = Bot()
            lis = [['昵称', '备注名称', '性别', '城市', '省份', '个人签名']]  # 把信息存储为一个二维列表,添加头部信息
            friend_all = bot.friends()
    
            for a_friend in friend_all:
                NickName = a_friend.raw.get('NickName', None) #获取所有好友信息 raw表示获取全部信息
                RemarkName = a_friend.raw.get('RemarkName', 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, RemarkName, Sex, City, Province, Signature]
                lis.append(list_0)
            return lis
    
        # 把lis信息写入到excle
        def friends_info_lis_to_excle(self):
            import openpyxl
            lis = self.get_friends_info()
            wb = openpyxl.Workbook()
            sheet = wb.active
            sheet.title = self.sheetname
            for i in range(0, len(lis)):
                for j in range(0, len(lis[i])):
                    sheet.cell(row=i+1, column=j+1, value=str(lis[i][j]))
            wb.save(self.filename)
            print("excel保存成功")
    
        #参数为condition 词频,提取两个列表,condition 和 人数,降序列表
        def extract_data_as_two_lis(self, condition):
            df = read_excel(self.filename, sheet_name=self.sheetname)
            X_list = df[condition].fillna('未知').tolist()  # 把列转换为list,用'未知'替换Nan?
            counts = {}  # 创建字典
            for word in X_list:
                counts[word] = counts.get(word, 0) + 1  # 统计词频
            items = list(counts.items())  # 返回所有键值对
            items.sort(key=lambda x: x[1], reverse=True)  # 降序排序
            keylist = list()
            valueslist = list()
            for item in items:
                word, count = item
                #if word == '0':
                    #word = "其他"
                keylist.append(word)  # 把词语降序word放进一个列表
                valueslist.append(count)
            return keylist, valueslist
    
        #参数为 save_name 自动添加jpg 创建X条件词云,
        def city_wordcloud(self, save_name, condition):
            wordlist, giveup = self.extract_data_as_two_lis(condition)
            new_wordlist = list()
            for i in range(25):
                new_wordlist.append(wordlist[i])
            wl = ' '.join(wordlist)  # 把列表转换成str wl为str类型,所以需要转换
            cloud_mask = np.array(Image.open("love.jpg"))  # 词云的背景图,需要颜色区分度高
            wc = WordCloud(
                background_color="black",  # 背景颜色
                mask=cloud_mask,  # 背景图cloud_mask
                max_words=100,  # 最大词语数目
                font_path='simfang.ttf',  # 调用font里的simfang.tff字体
                height=500,  # 设置高度
                width=2600,  # 设置宽度
                max_font_size=1000,  # 最大字体号
                random_state=1000,  # 设置随机生成状态,即有多少种配色方案
            )
            myword = wc.generate(wl)  # 用 wl的词语 生成词云
            # 展示词云图
            plt.imshow(myword)
            plt.axis("off")
            #plt.show()
            try:
                wc.to_file(save_name + '.jpg')  # 把词云保存下当前目录(与此py文件目录相同)
            except:
                print("词云保存失败")
    
        #参数为condition ,创建柱形html图片,
        def pillar_picture(self, condition, render_name):
            from pyecharts.charts import Bar
            from pyecharts.globals import ThemeType
            from pyecharts import options as opts
    
            keylist, valueslist = self.extract_data_as_two_lis(condition)
            new_keylist = list()
            new_valueslist = list()
            for i in range(10):
                new_keylist.append(keylist[i])
                new_valueslist.append(valueslist[i])
            bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
            # x轴 列表
            bar.add_xaxis(new_keylist)
            bar.add_yaxis("好友分布", new_valueslist)
            # render 会生成本地 HTML 文件,默认会在当前目录生成 城市分布柱状图.html 文件
            # 也可以传入路径参数,如 bar.render("mycharts.html")
            bar.render(render_name)
            print("pillar_picture图片保存成功!")
    
        #参数为condition,picture_name, keylist, valueslist, Map_condition->china或者广东创建html地图图片,图片名字为城市分布图
        def map_picture(self, condition, picture_name, keylist, valueslist, Map_condition):
            from pyecharts import options as opts
            from pyecharts.charts import Map
    
            def map_visualmap() -> Map:
                new_keylist = list()
                new_valueslist = list()
                if condition == '城市':
                    for i in range(len(keylist)):
                        # 列表处理,默认elsx里面的city没有'市'字,地图需要市字
                        new_keylist.append(keylist[i] + '市')
                        new_valueslist.append(valueslist[i])
                else:
                    for i in range(len(keylist)):
                        new_keylist.append(keylist[i])
                        new_valueslist.append(valueslist[i])
    
                c = (
                    Map()
                        .add("好友地图分布", [list(z) for z in zip(new_keylist, new_valueslist)], Map_condition)
                        .set_global_opts(
                        title_opts=opts.TitleOpts(title="Map-VisualMap"),
                        visualmap_opts=opts.VisualMapOpts(max_=100),
                    )
                )
                try:
                    c.render(picture_name)
                except:
                    print("html地图图片创建失败")
                print('html地图图片保存成功')
            map_visualmap()#调用自己
    
        #参数为condition,返回一个二维列表
        def find_friends_in_condition(self, condition):
            df = pd.read_excel(self.filename, usecols=[0, 1, 3], names=None)  #不要列名
            df_li = df.values.tolist()
            name = list()
            for data in df_li:
                condition = condition
                if condition in data:
                    name.append(data)
            self.map_picture()
            #print(len(name), name)
            return name
    
    
    if __name__ == "__main__":
        wechat = wechat_test('微信好友信息.xlsx', 'list')
        wechat.friends_info_lis_to_excle()
        wechat.city_wordcloud('城市词云', '城市')
        wechat.pillar_picture('城市', '城市分布柱状图.html')
        keylist, valueslist = wechat.extract_data_as_two_lis('城市')
        wechat.map_picture('城市', '城市分布图.html', keylist, valueslist, "广东")
        #wechat.find_friends_in_city()
    

    效果如下:

    1.好友数据提取(涉及个人隐私问题,做了点小动作)

     

    2.城市分布词云展示

    3.好友城市分布地图

    4.好友城市分布柱形图

    效果还是挺不错的。

  • 相关阅读:
    UI自动化定位控件添加醒目标识
    Web自动化测试代码优化方案之定位、操作
    面试常用英文关键字知多少
    Linux常用命令必知必会
    Jenkins自动化UI测试Tomcat报错“The web application [/jenkins] appears to have started a thread named”解决办法
    appium API元素定位方法汇总
    Jmeter参数化方法
    python学习-文件读写整理
    python学习_模块化示例
    python学习-python webdriver API(转载)
  • 原文地址:https://www.cnblogs.com/ReganWhite/p/10964352.html
Copyright © 2011-2022 走看看