Python 爬虫获取王者荣耀英雄图片

这两天闲来无事,恰好有个学弟在学 python,想爬王者的皮肤图片,于是将相关 url 给了我,我帮忙写了一个简单的脚本,分享上来供大家使用。

相关url

本爬虫程序需要两个 url。

  • 保存英雄信息的 JSON 文件:
    https://pvp.qq.com/web201605/js/herolist.json
    样子长这样,应该是一目了然:

    [{
      "ename": 105,
      "cname": "廉颇",
      "title": "正义爆轰",
      "new_type": 0,
      "hero_type": 3,
      "skin_name": "正义爆轰|地狱岩魂"
    }, {
      "ename": 106,
      "cname": "小乔",
      "title": "恋之微风",
      "new_type": 0,
      "hero_type": 2,
      "skin_name": "恋之微风|万圣前夜|天鹅之梦|纯白花嫁|缤纷独角兽"
    }, {
      "ename": 107,
      "cname": "赵云",
      "title": "苍天翔龙",
      "new_type": 0,
      "hero_type": 1,
      "hero_type2": 4,
      "skin_name": "苍天翔龙|忍●炎影|未来纪元|皇家上将|嘻哈天王|白执事|引擎之心"
    }.....
  • 获取英雄图片的 url:
    https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{英雄编号}/{英雄编号}-bigskin-{皮肤编号}.jpg
    这条是什么意思呢?我们拿小乔举例,上面的 JSON 里,小乔的 ename 是 106,就是这里的英雄编号,而皮肤编号是从 1 开始算的,JSON 里有 5 个皮肤,所以皮肤编号可以是 1 - 5。比如https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/106/106-bigskin-1.jpg就是小乔的原皮肤。

Python 爬虫获取王者荣耀英雄图片_第1张图片

编码实现

通过观察 JSON 文件,可以发现其是以对象数组的形式存在的,数组中的值就是保存一个英雄信息的对象,如果我们要获取指定英雄的皮肤,那么就要通过查找英雄的名称【ename】,获取其编号【cname】和皮肤名列表【skin_name】,由于【skin_name】是用 “|” 连在一起的,所以我们要分割字符串,统计其中有几个皮肤,我们就得到了相应的皮肤编号,然后填入 url 模板中即可。同时我们也可以将英雄名、皮肤名连接起来,作为下载的图片名称,方便管理。效果如图:
Python 爬虫获取王者荣耀英雄图片_第2张图片
具体代码:

import requests
import os

def save_IMG(hero_id, hero_name, skin_names, path):
    # 保存到指定目录,不存在则创建
    if not os.path.exists(path):
        os.mkdir(path)

    if not os.path.exists(path + "/" + hero_name):
        os.mkdir(path + "/" + hero_name)

    # skin_names 是皮肤名的列表,获取其长度,然后遍历获取它的下标
    for i in range(len(skin_names)):

        # 获取皮肤的 url 格式如下
        img_url = "https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/" + \
            str(hero_id) + "/" + str(hero_id) + \
            "-bigskin-" + str(i + 1) + ".jpg"

        # 发送请求。当 status_code 为 200 时,表明服务器已成功处理了请求.
        response = requests.get(img_url)
        if response.status_code == 200:
            # 保存在指定文件中,自定义图片名:英雄名-皮肤编号-皮肤名称
            with open(path+'/' + hero_name + "/" + hero_name + "-" + str(i+1) + "-" + skin_names[i] + '.jpg', 'wb') as f:
                f.write(response.content)  


if __name__ == "__main__":
    # 先获取保存英雄信息的 json 文件
    url = "https://pvp.qq.com/web201605/js/herolist.json"
    header = {
        "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
    }
    response = requests.get(url, headers=header)
    hero_list = response.json()

    # 我们需要英雄的编号,名称,以及皮肤名,用于后续拼接 url 和下载
    name = input("请输入要爬取的英雄名称:")
    for hero_dic in hero_list:
        hero_id = hero_dic["ename"]
        hero_name = hero_dic["cname"]
        skin_names = hero_dic["skin_name"].split("|")  # 分割出皮肤名称

        # 如果想爬取全部英雄的皮肤,就不需要判断了,直接遍历列表即可
        if hero_name == name:
            save_IMG(hero_id, hero_name, skin_names,
                     "./皮肤")    # 自定义保存图片的文件夹
            break

使用方法:

python .\getSkin.py
请输入要爬取的英雄名称:后羿

输入后会自动生成相应的文件夹,并将皮肤下载到该文件夹内。

如果你想一次性爬取所有皮肤,只需要按照代码注释里说的,去掉名称的判断,遍历整个列表即可。

你可能感兴趣的:(python)