Python爬微信好友头像,性别,所在地区

本文适合新手(有一定基础的小白)

今天没事,用的网页版微信,于是看源码心理作怪,F12打开,研究了一下,结果发现

/斜眼笑/斜眼笑/斜眼笑

再加上,没事干,(大家有好工作求介绍,本人待就业),Python也很久没弄了,于是(说干就干)

打开Python  

import   requests
import  json
from collections import Counter
from pyecharts import Pie
import hashlib

这里是所要用到的库文件

我们想说思路

第一步,获取Url数据

第二步,看看是不是反爬

第三步,取出数据研究类型

第四步 ,筛选数据,统计图表

第五步,图片下载 


第一 获取Url

貌似这里有

第二步,看看防爬嘛(应该反爬,毕竟这么大的公司,所以,管他防不防,都加headers

headers = {
           'Cookie': ' ~自己的 ',
        'Host': 'wx.qq.com',
        'Upgrade-Insecure-Requests': '1',
         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/'
        }

第三步,得出数据

数据是这样的

dict1 = json.loads(list_data.text)
print("%s: %s" % ("好友数" ,dict1["MemberCount"])) #字典
listdata=dict1["MemberList"] # 集合
 
    for  lists  in  range(0,dict1["MemberCount"]):  # 把全部用户的地址存储
        HeadImgUrls.append(listdata[lists]["HeadImgUrl"])
        sexs.append(listdata[lists]["Sex"])
        Province.append(listdata[lists]["Province"]+""+listdata[lists]["City"])
    rest=Counter(Province)   #这里是分组

第四步 ,筛选数据,统计图表

    pie = Pie("微信好友用户统计:好友%s" %( +dict1["MemberCount"]), title_pos='center',width=1400,height=600)
    pie.add(
        "",
        countProvin,
        Countcity,
        radius=[40, 75],
        label_text_color=None,
        is_label_show=True,
        legend_orient="vertical",
        legend_pos="left",
    )
    pie.render()

 

未知是公众号 

因为数据是 1为男, 2为女  0为公众号

数据显示这里我也不知道怎么讲,可以去看文档

http://pyecharts.org/#/zh-cn/charts_configure

第五步,图片下载 

获取图片地址。。。

然后下载

 

代码

# coding:utf8
import   requests
import  json
from collections import Counter
from pyecharts import Pie
import hashlib
# 微信Url数据获取连接
Wxurl="https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?lang=zh_CN&r=1551517351463&seq=0&skey=@crypt_80cc7620_ac3680d314a5860438086e5d54cf177d"
headers = { 
          Cookie': 'cookie',
        'Host': 'wx.qq.com',
        'Upgrade-Insecure-Requests': '1',
         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36'
        }
#TODO  Province_City 使用到的数组集合
Province = []
Countcity=[]
#TODO  存储性别
sexs=[]
#TODO  存储图片
HeadImgUrls=[]
def SexFun(Sexrests):
    # 性别方法
    print("男%s" % Sexrests[1])
    print("女%s" % Sexrests[2])
    print("公众号%s" % Sexrests[0])
    pie = Pie("微信好友性别统计" , title_pos='center', width=1400, height=600)
    pie.add(
        "",
        ['','','未知'],
        [Sexrests[1],Sexrests[2],Sexrests[0]],
        radius=[40, 75],
        title='sex',
        label_text_color=None,
        is_label_show=True,
        legend_orient="vertical",
        legend_pos="left",
    )
    pie.render('sex.html')
    print(Sexrests)
#TODO  Wechar_data  方法
def Wechar_data(Wxurl,headers):
    global  Province   # 转换为全局变量,假如不转换的话,会报错的
    global  Countcity
    global sexs
    global HeadImgUrls
    list_data = requests.get(Wxurl,headers=headers)
    list_data.encoding = "utf-8"
    print(list_data.text)
    dict1 = json.loads(list_data.text)
    print("%s: %s" % ("好友数" ,dict1["MemberCount"]))  #字典
    listdata=dict1["MemberList"]  # 集合
    #print(listdata)
    for  lists  in  range(0,dict1["MemberCount"]):  # 把全部用户的地址存储
        HeadImgUrls.append(listdata[lists]["HeadImgUrl"])
        sexs.append(listdata[lists]["Sex"])
        Province.append(listdata[lists]["Province"]+""+listdata[lists]["City"])
    rest=Counter(Province)   #这里是分组
    #print(rest)
    """
    Counter({'': 29, '湖南郴州': 21, '湖南长沙': 16, '广东深圳': 14, '广东中山': 9, '广东广州': 8, '北京朝阳': 7, '湖南娄底': 4, '湖南怀化': 4, '北京海淀': 3, '湖南益阳': 3, '上海浦东新区': 3, '安徽合肥': 2, '北京西城': 2, '广东佛山': 2, '广东湛江': 2, '湖南株洲': 2, '浙江杭州': 1, '北京东城': 1, '广东': 1, '四川德阳': 1, '辽宁丹东': 1, '河南三门峡': 1, '湖南张家界': 1, '广东肇庆': 1, '上海长宁': 1, '澳门路环岛': 1, '江苏': 1, '上海': 1, '湖南衡阳': 1, '河南南阳': 1, '湖南永州': 1, '北京': 1, 'North Shore': 1, '湖北恩施': 1, '湖南湘潭': 1, '湖南岳阳': 1, '湖南': 1, 'EnglandSheffield': 1, '湖南邵阳': 1, '湖北武汉': 1, '广东珠海': 1, 'Eastern': 1, '江西南昌': 1, 'SabahSemporna': 1, '四川成都': 1, '北京昌平': 1, '福建宁德': 1})
    """
    sets = set(Province)
    countProvin = list(sets)
    #print(countProvin)  #city
    '''    ['', '河南三门峡', '河南南阳', '北京', '广东肇庆', '广东中山', '上海长宁', '湖南长沙', '广东佛山', '福建宁德', '广东深圳', '湖南娄底', '辽宁丹东', '浙江杭州', '湖北恩施', 'North Shore', '湖南', '北京昌平', '上海浦东新区', '澳门路环岛', '湖南株洲', '湖南邵阳', 'SabahSemporna', '广东广州', '湖南张家界', '湖南衡阳', '湖南永州', '湖北武汉', '北京朝阳', '安徽合肥', '北京西城', '湖南岳阳', '广东', '北京东城', '江西南昌', '广东珠海', '四川德阳', '湖南郴州', '湖南益阳', 'EnglandSheffield', '四川成都', '广东湛江', '江苏', '湖南怀化', 'Eastern', '湖南湘潭', '上海', '北京海淀']'''
    #print(en(countProvin))48
    for  iii  in   range(0,len(countProvin)):
        #print(countProvin[iii])
        Countcity.append(rest[countProvin[iii]])
    #print(Countcity)  # num  list
    try:
        countProvin[0]="暂未填写地区"
    except   Exception:
        print("登录授权已过期")

    pie = Pie("微信好友用户统计:好友%s" %( +dict1["MemberCount"]), title_pos='center',width=1400,height=600)
    pie.add(
        "",
        countProvin,
        Countcity,
        radius=[40, 75],
        label_text_color=None,
        is_label_show=True,
        legend_orient="vertical",
        legend_pos="left",
    )
    pie.render()

    #性别判断
    Sexrests = Counter(sexs)  # 这里是分组
    #让代码看上去简单一点使用方法封装
    SexFun(Sexrests)
    HeadimgFun(HeadImgUrls,headers)
def HeadimgFun(imgdata,headers):
    #print(imgdata[0])
    md = hashlib.md5()  # 构造一个md5
    for i in range(0,len(imgdata)):
        utllist="https://wx.qq.com"+imgdata[i]
        reqs = requests.get(utllist,headers=headers)
        reqs.encoding = "utf-8"
        md.update(imgdata[i].encode())
        imgname=md.hexdigest()+".jpg"
        with  open('./images/'+imgname, 'wb') as  f:
            f.write(reqs.content)


Wechar_data(Wxurl,headers)
demo

不懂可以问我,觉得好就点个赞哈

原文地址:https://www.cnblogs.com/whatarey/p/10464993.html