用Python分析了20萬場吃雞數據,有不少有趣的發現
首先,神槍鎮樓:
背景
最近老闆愛上了吃雞(手游:全軍出擊),經常拉著我們開黑,只能放棄午休的時間,陪老闆在沙漠里奔波。
上周在在微信遊戲頻道看戰績的時候突發奇想,是不是可以通過這個方式抓取到很多戰鬥數據,然後分析看看有什麼規律。
秀一波戰績,開黑情況下我們團隊吃雞率非常高,近100場吃雞次數51次
簡單評估了一下,覺得可行,咱就開始。
Step 1分析數據介面
第一步當然是把這些戰績數據採集下來,首先我們需要了解頁面背後的故事。去看看頁面是如何獲取戰鬥數據的。
使用Charles抓包
抓包實現
在Mac下推薦使用工具Charles來從協議層抓取手機上的流量。
原理就是在Mac上開啟一個代*理*伺服器,然後將手機的網路代*理設置為Mac,這樣手機上的所有流量都會經過我們的代*理*伺服器了。
大致流程如下:
https加密流量的處理
經過研究,可以通過在手機和電腦都安裝Charles根證書的方式來實現對Https流量的分析,具體操作可以參考:
charles mac下https抓包和iphone https抓包
解決Charles無法正常抓包iOS 11中的Https請求
安裝證書後,我們的流量大致是這樣子的:
經過上述的配置,我們已經可以讀取到https的請求和響應數據了。
如下圖所示:
windows下用findler可以實現相同的功能
其實這就是一個非常典型的中間人場景
數據介面
接下來就根據這些數據來找出我們需要的介面了,經過分析,主要涉及三個介面:
獲取用戶信息介面
獲取用戶戰績列表介面
獲取用戶指定戰績詳細信息介面
下面我們一個一個看:
1.獲取用戶信息介面
request
response
分析
openid是用戶的惟一標識。
2. 獲取用戶戰績列表介面
request
response
分析
這個介面用after_time來進行分頁,遍歷獲取時可以根據介面響應的has_next和next_after_time來判斷是否還有下一頁的數據。
列表裡面的room_id是每一場battle的惟一標識。
3. 獲取用戶戰績詳情介面
request
request
分析
這個介面響應了戰鬥的詳細信息,包括殺*敵數、爆*頭數、救人數、跑動距離等等,足夠我們分析了。
這個介面還響應了是被誰殺死的以及組團成員的openid,利用這個特性我們這可無限深度的發散爬取更多用戶的數據。
至於cookie中的息pass_ticket等信息肯定是用於許可權認證的,在上述的幾次請求中這些信息都沒有變化。
所以我們不需要深研其是怎麼算出來的,只需要抓包提取到默認信息後填到代碼裡面就可以用了。
Step 2爬取數據
介面已經確定下來了,接下來就是去抓取足夠量的數據了。
使用requests請求介面獲取數據
參照這種方式我們可以很快把另外兩個介面寫好。
使用redis來標記已經爬取過的信息
在上述介面中我們可能從用戶A的入口進去找到用戶B的openid,然後從用戶B的入口進去又找到用戶A的openid。
為了避免重複採集,所以我們需要記錄下哪些信息是我們採集過的。
核心代碼片斷:
使用celery來管理隊列
celery是一個非常好用的分散式隊列管理工具。
我這次只打算在我自己的電腦上運行,所以並沒有用到分散式的功能。
我們創建三個task和三個queue
然後在task中控制API請求和Redis數據實現完整的任務邏輯,如:
開始抓取
因為我們是發散是爬蟲,所以需要給代碼一個用戶的入口,需要手動創建一個用戶的採集任務。
有入口之後我們就用celery來啟動worker去開始爬蟲
這樣我們的爬蟲就可以愉快的跑起來了。再通過celery-flower來查看執行情況。
通過flower,我們可以看到運行的效率還是非常不錯的。
在執行過程中會發現get_battle_list跑太快,導致get_battle_info即使開了30個並發都還會積壓很多。
所以需要適時的去停一下這些worker, 在我們抓到20萬條信息之後就可以停下來了。
Step 3數據分析
1. 平均用戶日在線時長2小時
從分布圖上看大部分用戶都在1小時以上,最猛的幾個人超過8小時。
註:我這裡統計的是每一局的存活時間,實際在線時長會比我這個更長。
2. 女性角色被救次數高於男性
終於知道為什麼有那麼多人妖了,原來在遊戲裡面可以佔便宜啊。
3. 女性角色救人次數高於男性
給了大家一個帶妹上分的好理由。
4. 周五大家最忙
估計周五大家都要忙著交差和寫周報了。
5. 晚上22點是遊戲高峰
凌晨還有那麼多人玩,你們不睡覺嗎?
6. 最遠擊*殺距離639米
我看了一下98K、SKS和AWP的有效射程,大致都在800米以內,所以這個值可信度還是可以的。
反過來看抖音上的那些超遠距離擊*殺應該都是擺拍的。
7. 能拿到「救死扶傷」稱號才是最高榮耀
從分布情況可以看出來,救死扶傷比十殺還要難。
能拿到救死扶傷稱號的大部分都是女性角色,再一次證明玩遊戲要帶妹。
回歸到這個遊戲的本質,那就是生存遊戲,沒什麼比活下來更重要的了。
結尾
這次爬蟲主要是利用了微信遊戲頻道可以查看陌生人數據的場景才能提取到這麼多數據。
我們可以通過同樣的手段來分析王者榮耀和其它遊戲的數據,有興趣的同學可以嘗試一下。
最後再說一下,UMP9是把好槍,配2倍鏡非常爽。
作者:張波
來源:
版權歸原作者所有,轉載僅供學習使用,不用於任何商業用途,如有侵權請留言聯繫刪除,感謝合作。
-----這裡是數學思維的聚集地------
「超級數學建模」(微信號supermodeling),每天學一點小知識,輕鬆了解各種思維,做個好玩的理性派。60萬數學精英都在關注!
TAG:超級數學建模 |