zoukankan      html  css  js  c++  java
  • 利用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()
  • 相关阅读:
    MySQL "show users"
    MySQL
    A MySQL 'create table' syntax example
    MySQL backup
    MySQL show status
    Tomcat, pathinfo, and servlets
    Servlet forward example
    Servlet redirect example
    Java servlet example
    How to forward from one JSP to another JSP
  • 原文地址:https://www.cnblogs.com/geekworld/p/8383758.html
Copyright © 2011-2022 走看看