# 导入发送请求模块(需命令行安装:pip install requests)
import requests
# 导入解析HTML代码工具(需命令行安装:pip install lxml)
from lxml import etree
# 导入文件处理
import os
# 导入睡眠时间, 预防请求过快导致停封
from time import sleep
# 伪装成浏览器
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'}
# 发送请求,获取英雄列表
hero_list_url = 'https://pvp.qq.com/web201605/js/herolist.json'
hero_list_req = requests.get(hero_list_url, headers=headers)
# 循环遍历各个英雄
for h in hero_list_req.json():
# 英雄编号
ename = h.get('ename')
# 英雄名称
cname = h.get('cname')
# 如果英雄名称文件夹不存在,则创建
if not os.path.exists(cname):
os.makedirs(cname)
# 发送请求,获取英雄详情(注:此处不使用hero_list_req.json()中的skin_name是因为这里的皮肤不全)
hero_info_url = f'https://pvp.qq.com/web201605/herodetail/{ename}.shtml'
hero_info_req = requests.get(hero_info_url, headers=headers)
# 设置编码方式,否则显示乱码
hero_info_req.encoding = 'GBK'
# 解析HTML代码
e = etree.HTML(hero_info_req.text)
# 获取该英雄所有皮肤名称: ['惊鸿之笔&0', '修竹墨客&0', '梁祝&53', '天狼绘梦者&19', '神器·万象笔&103']
names = e.xpath('//ul/@data-imgname')[0]
# 处理英雄皮肤名称(如果名称中包含&则截取出名称,如果不包含&则直接取): ['惊鸿之笔', '修竹墨客', '梁祝', '天狼绘梦者', '神器·万象笔']
names = [(name[0:name.index('&')] if '&' in name else name) for name in names.split('|')]
print(f'开始下载[{cname}]皮肤')
# 循环遍历下载(index: 索引,name:皮肤名称)
for index, name in enumerate(names):
# 发送请求,获取英雄皮肤
hero_skin_url = f'https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{ename}/{ename}-bigskin-{index + 1}.jpg'
res = requests.get(hero_skin_url, headers=headers)
# 图片不存在则下载,{cname}/{name}.jpg可替换成自己想要的路径
if not os.path.exists(f'{cname}/{name}.jpg'):
# open:打开文件的意思,没有文件则会创建,{cname}/{name}.jpg:存放图片的路径 wb:w-写,b-byte
# 解释代码:把图片的内容以byte方式写入到路径为{cname}/{name}.jpg的文件中
with open(f'{cname}/{name}.jpg', 'wb') as f:
f.write(res.content)
print(f'[{cname} => {name}]皮肤已下载完成')
# 睡眠2秒,防止访问过快导致停封
sleep(2)
print("王者荣耀全部皮肤已下载完成")