利用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()
原文地址:https://www.cnblogs.com/geekworld/p/8383758.html