爬取王者農藥英雄全部資訊, 長知識了!!!

  • 2020 年 2 月 13 日
  • 筆記

閱讀本文需要5分鐘

說起打王者農藥, 本狗覺得該改名字了, 叫「菜狗」。哈哈!!!

老話說的好 :「知己知彼, 百戰不殆「, 為此, 本狗爬取了所有英雄的屬性。由於數據太多, 本狗只選取了部分屬性。

01

開發工具: python版本:3.6 相關模組: time,random, requests, json, csv

環境搭建: 安裝python並添加到環境變數, pip 安裝需要相關的模組

原理講解: 下載軟體王者榮耀盒子, 在下載一款抓包軟體(後期會單獨講解), 然後進行抓包分析每個英雄屬性的URL, 以及URL里包含的關鍵參數。

抓包軟體: Charles 官網:https://www.charlesproxy.com

Fiddler 官網: https://www.telerik.com/fiddler

02

英雄屬性URL分析:

http://gamehelper.gm825.com/wzry/hero/detail?hero_id={}&channel_id=90009a&app_id=h9044j&game_id=7622&game_name=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80&vcode=13.0.4.0&version_code=13040&cuid=3B126F96F35A016D73291009CD5E50E6&ovr=8.0.0&device=Xiaomi_MI+5&net_type=1&client_id=N1JNAHycUGkyzWHhbS3kYg%3D%3D&info_ms=&info_ma=1AG%2BU5F%2BVgDIiztBezWnV0LgQU5N8mcv%2Bgn2XRGrrss%3D&mno=0&info_la=IeNdtn7WlOBNGeAcmWIiZg%3D%3D&info_ci=IeNdtn7WlOBNGeAcmWIiZg%3D%3D&mcc=0&clientversion=13.0.4.0&bssid=xRZNXKP64ftQFZayVWuBTVFMa1TEQfyLCH4LBeHllq8%3D&os_level=26&os_id=f1704e96b75006e4&resolution=1080_1920&dpi=480&client_ip=192.168.2.25&pdunid=a24bc615

嚇傻了吧,一個英雄屬性的URL就這麼長, 但是, 經過本狗仔細分析, 只需要改變一個地方就好。噹噹當, 就是「hero_id」。

分析hero_id :

經過本狗多次測試, 發現它的範圍在[1, 136], 但是, 中間有些值是沒有屬性的。經過解析json數據, 得到一個關鍵字 『error_code』

當 error_code == 0 時, 是有數據的

當 error_code != 0 時, 是無數據的

03

上程式碼:

  1. 防反爬的請求頭部是必不可少的:
 headers = {          'charset': 'UTF-8',          'Accept-Encoding': 'gzip,deflate',          'referer': 'https://servicewechat.com/wx5c8ee452674d1941/36/page-frame.html',          'content-type': 'application/x-www-form-urlencoded',          'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 8.0.0; MI 5 MIUI/V10.2.1.0.OAACNXM) ',          'X-Requested-With': 'XMLHttpRequest',          'Host': 'gamehelper.gm825.com',          'Connection': 'Keep-Alive'      }  

2 baseurl:

baseurl = 'http://gamehelper.gm825.com/wzry/hero/detail?hero_id={}'              '&channel_id=90009a&app_id=h9044j&game_id=7622&game_name=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80&vcode=13.0.4.0&version_code=13040&cuid=3B126F96F35A016D73291009CD5E50E6&ovr=8.0.0&device=Xiaomi_MI+5&net_type=1&client_id=N1JNAHycUGkyzWHhbS3kYg%3D%3D&info_ms=&info_ma=1AG%2BU5F%2BVgDIiztBezWnV0LgQU5N8mcv%2Bgn2XRGrrss%3D&mno=0&info_la=IeNdtn7WlOBNGeAcmWIiZg%3D%3D&info_ci=IeNdtn7WlOBNGeAcmWIiZg%3D%3D&mcc=0&'              'clientversion=13.0.4.0&bssid=xRZNXKP64ftQFZayVWuBTVFMa1TEQfyLCH4LBeHllq8%3D&'              'os_level=26&os_id=f1704e96b75006e4&resolution=1080_1920&dpi=480&'              'client_ip=192.168.2.25&pdunid=a24bc615'

3 通過URL的分析開始構建新的URL:

data_list = []      for i in range(1, 137):          url = baseurl.format(i)          time.sleep(random.randint(1, 3))          response = requests.get(url, headers=headers).text          time.sleep(random.randint(1, 3))          hero_info = json.loads(response)

4 獲取部分資訊, 並且添加到列表:

 hero_info_ = {}   error_code = hero_info.get('error_code')          if error_code != 0:              print('暫無英雄屬性')           else:              hero_name = hero_info.get('info')['name']              hero_info_['姓名'] = hero_name                hero_tips = ''.join(hero_info.get('info')['hero_tips']).replace('rn', '')  # 對抗技巧              hero_info_['對抗技巧'] = hero_tips                melee_tips = ''.join(hero_info.get('info')['melee_tips']).replace('rn', '')  # 團戰思想              hero_info_['團戰思想'] = melee_tips                restrained_heros = hero_info.get('info')['restrained_hero']  # 壓制英雄              for restrained_hero in  restrained_heros:                  restrained_heros_name = restrained_hero['name']                  hero_info_['壓制英雄'] = restrained_heros_name                be_restrained_heros = hero_info.get('info')['be_restrained_hero']  # 被壓制的英雄              for be_restrained_hero in be_restrained_heros:                    be_restrained_hero_name = be_restrained_hero['name']                  hero_info_['被壓制的英雄'] = be_restrained_hero_name                partner_heros = hero_info.get('info')['partner_hero']   # 搭檔英雄              for partner_hero in partner_heros:                  partner_hero_name = partner_hero['name']                  hero_info_['搭檔英雄'] = partner_hero_name                data_list.append(hero_info_)  

5 保存入庫 (csv文件):

        header = ['姓名', '對抗技巧', '團戰思想', '壓制英雄', '被壓制的英雄', '搭檔英雄']          with open('英雄特徵.csv', 'w', encoding='gbk', newline='')as f:              writer = csv.DictWriter(f, header)              writer.writeheader()              writer.writerows(data_list)            print("第%d個英雄" % i, hero_info_)

04

運行效果圖:

部分保存效果圖:

這部分屬性對於本狗來說, 足夠了解英雄的啦, 有機會,可以開一把黑!! 需要源程式碼和數據的 回復 【王者農藥】 2019-5-18 測試正常