您的位置:首页 > 编程语言 > Python开发

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

2020-03-05 05:24 661 查看

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

运行效果图:

 

 

【准备环境】

  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("\t{}、{}({})".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("\n>>>>>>>>>>>>>微信联系人总男女信息:")
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("\n>>>>>>>>>>>>>各地区男女分布信息:")
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("\n{}:\n\t>>>>>:{}".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

  • 点赞
  • 收藏
  • 分享
  • 文章举报
aipeng6550 发布了0 篇原创文章 · 获赞 0 · 访问量 254 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: