• 利用Python统计微信联系人男女比例以及简单的地区分布


    寒暄的话不多说,直接进入主题。

    运行效果图:

    【准备环境】

      Python版本:v3.5及其以上

      开发工具:随意,此处使用Pycharm

    【依赖包】

      1、itchat (CMD运行:pip install itchat   进行安装)

      2、pycharts (CMD运行:pip install pyecharts   进行安装)

      itchat包是对网页版微信相关接口封装的一个第三方包,目前来说比较好用,一会代码里面会用到相关接口(注释说明);

      pycharts包进行图表的创建,只是用到了其初级功能,大家有时间可以将代码改改,生成更全面直观的图表,代码中使用的柱状图,稍显low,可以升级为全国热点图,这样人员的地区分布就更加直观了。

    代码:

      1 import itchat
      2 from collections import Counter
      3 from pyecharts import Bar
      4 
      5 dict_sex = {}
      6 count_city = None
      7 
      8 # itchat微信登录,hotReload表示热登录,如果是True,下一次就不用扫码了(时间不能过长),会在根目录生成一个 itchat.pkl 的文件
      9 itchat.auto_login(hotReload=True)
     10 # itchat 的get_friends接口,获取微信好友列表,返回的列表第一位是你自己,如果想过滤掉自己,改为:itchat.get_friends()[1:]
     11 member_list = itchat.get_friends()[0:]
     12 
     13 
     14 def calc_all_sex():
     15     """
     16     微信联系人总男女信息
     17     :return:
     18     """
     19     man = woman = others = 0
     20     city = []
     21     for index, name in enumerate(member_list):
     22         print("	{}、{}({})".format(index, name["RemarkName"] if name["RemarkName"] is not "" else name["NickName"], name["UserName"]))
     23         sex = name["Sex"]
     24         if sex == 1:
     25             man += 1
     26         elif sex == 2:
     27             woman += 1
     28         else:
     29             others += 1
     30         if name["City"] == "":
     31             city.append("未知城市")
     32         else:
     33             city.append(name["City"])
     34 
     35     global count_city
     36     count_city = Counter(city)
     37     total = len(member_list)
     38     man_percent = (float(man) / total * 100)
     39     woman_percent = (float(woman) / total * 100)
     40     others_percent = (float(others) / total * 100)
     41 
     42     print("
    >>>>>>>>>>>>>微信联系人总男女信息:")
     43     print("男性好友:%.2f%%" % man_percent)
     44     print("女性好友:%.2f%%" % woman_percent)
     45     print("其    它:%.2f%%" % others_percent)
     46 
     47 
     48 class PeopleInfo:
     49     def __init__(self, man_, woman_, _others, total_):
     50         self.man = man_
     51         self.woman = woman_
     52         self.others = _others
     53         self.total = total_
     54 
     55 
     56 def count(dict_={}):
     57     """
     58     计算各个地区的男女人数
     59     :param dict_:
     60     :return:
     61     """
     62     print("
    >>>>>>>>>>>>>各地区男女分布信息:")
     63     for val in dict_:
     64         city_tmp = "" if val == "未知城市" else val
     65         man = woman = others = 0
     66         for member in member_list:
     67             if member["City"] == city_tmp:
     68                 sex = member["Sex"]
     69                 if sex == 1:
     70                     man += 1
     71                 elif sex == 2:
     72                     woman += 1
     73                 else:
     74                     others += 1
     75         people_info = PeopleInfo(man, woman, others, dict_[val])
     76         dict_sex[val] = people_info
     77         print("【{}】男性:{},女性:{},其它:{}".format(city_tmp, man, woman, others))
     78 
     79 
     80 def count_sex_area():
     81     """
     82     统计联系人性别、地区
     83     :return:
     84     """
     85     calc_all_sex()
     86     attr = ["{}".format(i) for i in count_city]
     87     count(count_city)
     88     v1 = []
     89     man_count = []
     90     woman_count = []
     91     others_count = []
     92     for i in attr:
     93         v1.append(count_city[i])
     94         man_count.append(dict_sex[i].man)
     95         woman_count.append(dict_sex[i].woman)
     96         others_count.append(dict_sex[i].others)
     97 
     98     bar = Bar(title="{}的微信联系人分布".format(member_list[0]["NickName"]), subtitle="微信联系人分布情况", width=2024, height=768)
     99     bar.add("地区人数", attr, v1, mark_line=["average"], mark_point=["max", "min"])
    100     bar.add("男性", attr, man_count, mark_line=["average"], mark_point=["max", "min"])
    101     bar.add("女性", attr, woman_count, mark_line=["average"], mark_point=["max", "min"])
    102     bar.render(path="地区统计.html")
    103 
    104 
    105 def get_signatare():
    106     """
    107     获取微信联系人的签名信息
    108     :return:
    109     """
    110     for member in member_list:
    111         signatare = str(member["Signature"])
    112         print("
    {}:
    	>>>>>:{}".format(member["RemarkName"], signatare))
    113 
    114 
    115 if __name__ == '__main__':
    116     count_sex_area()
    117     # get_signatare()
  • 相关阅读:
    cond
    示例:字串代换
    char char=
    (1+ val)
    UNIX通用系统变量和shell命令行参数(转)
    为python安装numpy和scipy(federo)
    浅谈HTTP中Get与Post的区别(转)
    JSON学习笔记
    javascript 实现圆角,兼容ie
    Dangling pointers and Wild pointers
  • 原文地址:https://www.cnblogs.com/geekworld/p/8383758.html
Copyright © 2020-2023  润新知