今天
小帥b來跟你玩玩
爬取微信好友
然后做一頓分析
其實(shí)
關(guān)于微信好友的爬取分析
挺早之前小帥b就分享過類似的了
但是那會
帥b我更多的是裝逼
有些細(xì)節(jié)沒跟你好好說說
導(dǎo)致有些 b 友有點(diǎn)懵逼
那么到現(xiàn)在
我想是個(gè)不錯(cuò)的時(shí)機(jī)了
到什么階段就干什么事情
而且
前兩篇也是寫到和微信相關(guān)的
所以索性就再寫一篇吧
這次
應(yīng)該能讓你更加容易
明白其中的道理
廢話不多說
接下來就是
學(xué)習(xí) python 的正確姿勢
我們打開微信網(wǎng)頁版本
https://wx2.qq.com
打開瀏覽器
可以看到一開始要
我們使用二維碼登錄
來看看究竟做了什么操作
打開瀏覽器的開發(fā)者模式
可以看到
一開始會得到一個(gè)二維碼的圖片
然后就開始
一頓輪詢判斷你是否掃碼登錄
我們點(diǎn)進(jìn)去看一下
這個(gè)接口的具體請求
這個(gè)鏈接主要是攜帶了二維碼的 uuid
以及一些必要的參數(shù)
https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=Yc5DKYxsrA==&tip=0&r=-215826228&_=1559288877820
當(dāng)我們沒有掃碼登錄的時(shí)候
返回的是 408
接著打開手機(jī)的微信
掃碼之后就返回 201 了
接著在手機(jī)點(diǎn)一下登錄就可以進(jìn)去了
可以看到 getContact 這個(gè)接口
一看名稱就知道是獲取聯(lián)系人的
看下返回的數(shù)據(jù)
是一個(gè) Json
聯(lián)系人被封裝到這個(gè) MemberList 數(shù)組里面了
再來
發(fā)個(gè)消息看看
數(shù)據(jù)的同步
至此
我們已經(jīng)摸清了
微信網(wǎng)頁版的具體流程了
具體是這樣的
第一步
打開微信網(wǎng)頁版首頁
然后分配一個(gè)隨機(jī)的 UUID
第二步
根據(jù) UUID 獲取二維碼的圖片
第三步
手機(jī)微信掃碼這個(gè)二維碼
然后確認(rèn)登錄
第四步
瀏覽器一直不停的調(diào)用同一個(gè)接口
看看是否登錄
登陸的話就開始調(diào)用登錄接口
第五步
獲取到所有聯(lián)系人的信息
第六步
可以開始向聯(lián)系人發(fā)送消息
然后就不斷的調(diào)用同步接口
用來獲取最新的消息
知道了這些之后
我們就可以使用 python 來操作微信了
不過
你不知道這些也沒關(guān)系
因?yàn)?itchat 模塊早已封裝了一切
我們可以使用 itchat 來進(jìn)行模擬登錄
然后獲取到自己的好友信息
調(diào)用 itchat 的 get_friends 就會得到
好友的列表信息
具體到每個(gè) friend 是這樣的
可以看到
每個(gè) item 里面都有好友的具體信息
包括昵稱,頭像,性別,地址等等
其中的 sex 字段
1 表示男的
2 表示女的
0 表示未知
來分析一波吧
將獲得的 friends 這個(gè)列表中
把 sex 這個(gè)字段的數(shù)據(jù)拿出來
map(lambda x: x['Sex'], friends[1:])
然后我們再將它轉(zhuǎn)化為 list
sexs = list(map(lambda x: x['Sex'], friends[1:]))
有了 sexs 這個(gè)列表之后
我們就可以通過 count 函數(shù)
來獲取每個(gè)性別的人數(shù)
從而算出比例了
比如男性所占的比例如下
('小哥哥', sexs.count(1)/sum)
接著使用 pyecharts 這個(gè)模塊的 Pie
來畫個(gè)餅圖吧
pie = Pie()
pie.add("", [('小哥哥', sexs.count(1)/sum), ('小姐姐', sexs.count(2)/sum), ('未知', sexs.count(0)/sum)])
pie.set_global_opts(title_opts=opts.TitleOpts(title="帥b的朋友性別比例"))
pie.render('sex.html')
運(yùn)行一波
知道真相的我
眼淚掉下來
咱也不知道
還有多少是偽裝成女的
咱也不敢問吶
再來分析個(gè)吧
看看小帥b的py們都是在哪里的
將 friends 列表里的 province 拿出來
map(lambda x: x['Province'], friends[1:])
再轉(zhuǎn)化成 list
province = list(map(lambda x: x['Province'], friends[1:]))
接著創(chuàng)建兩個(gè)列表
keys = []
values = []
一個(gè)用來放省份的名稱
一個(gè)用來存放對應(yīng)身份的數(shù)量
for i in set(province):
keys.append(i)
values.append(province.count(i))
接著就可以通過 zip 函數(shù)
將兩個(gè)列表的數(shù)據(jù)轉(zhuǎn)化成元組序列
lists = list(zip(keys, values))
有了數(shù)據(jù)之后
就可以通過 pyecharts 的 map 來整個(gè)地圖了
m = Map()
m.add("小帥b的py們", lists, "china")
m.set_global_opts(title_opts=opts.TitleOpts(title="小帥b的py們都在哪里?"), visualmap_opts=opts.VisualMapOpts(max_=200))
m.render('location.html')
運(yùn)行一波
可以發(fā)現(xiàn)
廣東人最多
也是
畢竟小帥b就是廣東人
然而
全中國小帥b就差青海的 py 了
如果你是青海的
聯(lián)系客服