使用Python脚本下载王者**游戏英雄皮肤原画图片(含源码)

前言

出于美术借鉴学习的目的,需要该游戏的英雄皮肤原画图片,所以进行了分析和本地下载,代码导入了必要的库:os、re、urljoin、requests和lxml.etree。
代码和下载资源仅供学习使用,版权&著作权归原作者所有!运行时请遵守网站相关规定,控制请求频率。出现侵权以及经济纠纷后果自负

在这里插入图片描述

在这里插入图片描述
下载的图片基本是 1920*882的尺寸,大小在几百KB – 1MB范围内:

在这里插入图片描述

实现过程

其核心思路:是访问英雄列表接口获取所有英雄数据,遍历每个英雄:创建对应的存储目录,解析英雄详情页获取皮肤信息,批量下载所有皮肤图片。

创建目录

base_dir = os.path.join('WangZhe_Imgs')
os.makedirs(base_dir, exist_ok=True)  # 自动创建基础目录
hero_dir = os.path.join(base_dir, cname)
os.makedirs(hero_dir, exist_ok=True)  # 创建英雄专属目录

示例:英雄"孙悟空"的皮肤会保存在WangZhe_Imgs/孙悟空/目录下

详情页

resp = requests.get(hurl)  # 请求英雄详情页
resp.encoding = resp.apparent_encoding  # 自动检测编码
curr = etree.HTML(resp.text)  # 构建HTML解析器

获取图URL

src = curr.xpath("//div[@class='zk-con1 zk-con']/@style")
url_part = style.split('url(')[1].split(')')[0].strip('\'"')
base_img_url = urljoin(hurl, url_part)  # 拼接完整URL

最终得到基础URL示例:https://***/…/109-bigskin-1.jpg

处理URL

base_part, ext_part = base_img_url.split('-1.', 1)
ext = f".{ext_part.split('?')[0]}"  # 提取扩展名并去除参数

获取图片名

pic_pf = curr.xpath("//div[@class='pic-pf']/ul/@data-imgname")
skin_names = pic_pf[0].split('|')

下载所有

for idx, skin_name in enumerate(skin_names, 1):
    skin_url = f"{base_part}-{idx}{ext}"  # 生成实际图片URL
    safe_name = re.sub(r'[\\/*?:"<>|]', '_', skin_name)  # 清理非法字符
    resp_img = requests.get(skin_url)

代码

完整代码如下:

import os
import re
from urllib.parse import urljoin
import requests
from lxml import etree


def download_images(hurl, cname):
    # 创建基础目录和英雄目录
    base_dir = os.path.join('WangZhe_Imgs')
    os.makedirs(base_dir, exist_ok=True)
    hero_dir = os.path.join(base_dir, cname)
    os.makedirs(hero_dir, exist_ok=True)

    resp = requests.get(hurl)
    if resp.status_code != 200:
        print(f"请求失败,状态码:{resp.status_code},英雄:{cname}")
        return
    resp.encoding = resp.apparent_encoding
    curr = etree.HTML(resp.text)

    # 提取背景图片URL
    src = curr.xpath("//div[@class='zk-con1 zk-con']/@style")
    if not src:
        print(f"未找到皮肤图片,英雄:{cname}")
        return
    style = src[0]
    if 'url(' not in style:
        print(f"样式格式错误,英雄:{cname}")
        return
    url_part = style.split('url(')[1].split(')')[0].strip('\'"')
    base_img_url = urljoin(hurl, url_part)

    # 处理图片URL格式
    if '-1.' not in base_img_url:
        print(f"图片URL格式不符:{base_img_url},英雄:{cname}")
        return
    base_part, ext_part = base_img_url.split('-1.', 1)
    ext = f".{ext_part.split('?')[0]}"  # 去除查询参数

    # 提取皮肤名称
    pic_pf = curr.xpath("//div[@class='pic-pf']/ul/@data-imgname")
    if not pic_pf:
        print(f"未找到皮肤名称,英雄:{cname}")
        return
    skin_names = pic_pf[0].split('|')

    # 下载皮肤图片
    for idx, skin_name in enumerate(skin_names, 1):
        skin_url = f"{base_part}-{idx}{ext}"
        # 清理非法字符
        safe_name = re.sub(r'[\\/*?:"<>|]', '_', skin_name)
        save_path = os.path.join(hero_dir, f"{safe_name}.jpg")
        # 下载并保存
        resp_img = requests.get(skin_url)
        if resp_img.status_code == 200:
            with open(save_path, 'wb') as f:
                f.write(resp_img.content)
            print(f"下载成功:{cname} - {safe_name}")
        else:
            print(f"下载失败:{skin_url}")


def main(url):
    resp = requests.get(url)
    if resp.status_code != 200:
        print("获取英雄列表失败")
        return
    for hero in resp.json():
        hero_url = f"https://pvp.秋秋.com/web201605/herodetail/{hero['ename']}.shtml"
        download_images(hero_url, hero['cname'])


if __name__ == '__main__':
    url = 'https://pvp.秋秋.com/web201605/js/herolist.json'
main(url)

运行在这里插入图片描述

再次强调
以上代码和下载资源仅供学习使用,版权&著作权归原作者所有!运行时请遵守网站相关规定,控制请求频率。出现侵权以及经济纠纷后果自负

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十幺卜入

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值