前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬取王者农药英雄全部信息, 长知识了!!!

爬取王者农药英雄全部信息, 长知识了!!!

作者头像
Python知识大全
修改2023-09-21 14:24:05
4490
修改2023-09-21 14:24:05
举报
文章被收录于专栏:Python 知识大全Python 知识大全

阅读本文需要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. 防反爬的请求头部是必不可少的:
代码语言:javascript
复制
 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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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 获取部分信息, 并且添加到列表:

代码语言:javascript
复制
 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('\r\n', '')  # 对抗技巧
            hero_info_['对抗技巧'] = hero_tips
            
            melee_tips = ''.join(hero_info.get('info')['melee_tips']).replace('\r\n', '')  # 团战思想
            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文件):

代码语言:javascript
复制
        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 测试正常

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python 知识大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图像处理
图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档