微信号:PythonPush

介绍:人生苦短,我用 Python.Python 越来越受广大程序员的喜爱.

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

2019-03-14 19:21 程序君

Linux编程
点击右侧关注,免费入门到精通!


作者丨Cgrain

https://www.cnblogs.com/whatarey/p/10464993.html


基本环境配置


版本:Python3.6


系统:Windows


相关模块:


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


基本的爬虫思路


第一步,获取Url数据


第二步,看看是不是反爬


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


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


第五步,图片下载



获取URL



是否反爬


   
             
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=[4075],
        label_text_color=None,
        is_label_show=True,
        legend_orient="vertical",
        legend_pos="left",
    )
    pie.render()



完整代码


# 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


 推荐↓↓↓ 

👉16个技术公众号】都在这里!

涵盖:程序员大咖、源码共读、程序员共读、数据结构与算法、黑客技术和网络安全、大数据科技、编程前端、Java、Python、Web编程开发、Android、iOS开发、Linux、数据库研发、幽默程序员等。

万水千山总是情,点个 “ 好看” 行不行
 
Python开发 更多文章 一行 Python 代码实现并行,骚技能! 20行 Python 代码实现验证码识别 最全 14 张思维导图:教你构建 Python 编程的核心知识体系! 8 种常被忽视的 SQL 错误用法 上网流量不够用怎么办?python程序员教你暴力破解WiFi!
猜您喜欢 印度也有“芯酸往事” 为什么运维人的耻辱感能助力你的职业上升 2016这一年,回顾我们一起走过的"编码美丽"之路! Deep Dive 3 - NIO 为什么开源可以提高程序员的编程技能?