网站建设的风格/灰色行业seo大神
前言
出于美术借鉴学习的目的,需要该游戏的英雄皮肤原画图片,所以进行了分析和本地下载,代码导入了必要的库: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}" # 生成实际图片URLsafe_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 etreedef 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}")returnresp.encoding = resp.apparent_encodingcurr = etree.HTML(resp.text)# 提取背景图片URLsrc = curr.xpath("//div[@class='zk-con1 zk-con']/@style")if not src:print(f"未找到皮肤图片,英雄:{cname}")returnstyle = src[0]if 'url(' not in style:print(f"样式格式错误,英雄:{cname}")returnurl_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}")returnbase_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}")returnskin_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("获取英雄列表失败")returnfor 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)
运行
:
再次强调
以上代码和下载资源仅供学习使用,版权&著作权归原作者所有!运行时请遵守网站相关规定,控制请求频率。出现侵权以及经济纠纷后果自负。