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