寒暄的话不多说,直接进入主题。
运行效果图:
【准备环境】
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()