王者荣耀皮肤
1.由于需要的是英雄皮肤,先进入英雄资料页面。
2.这个页面没有英雄皮肤,而且云中君以前的英雄是动态加载的。
3.加载页面时向这个地址发送了请求,返回的响应有大量相同格式的Json字符串,结合这个命名猜测是全部英雄信息
4.点开英雄详情看一下,地址栏里出现类似英雄编号的数字,我的猜想可能是正确的,而且看到了有英雄皮肤
5.鼠标放在小图上时,背景的高清大图地址随之加载
6.经查看,这里的地址就是我们需要的皮肤大图
7.查找一下可以发现规律,地址中的506是英雄编号,2是皮肤编号,所以无需向英雄详情页发送请求
https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/506/506-bigskin-2.jpg
8.那么问题来了,如何知道一个英雄有几个皮肤呢
这里可以回到英雄列表页面的响应看一下,这里是皮肤名称,以|分割
获取的时候输出一下可以看到这样就能获得英雄皮肤数目
9.现在大致的流程就清楚了
(1)先发送请求获取英雄列表的信息
(2)提取其中的ename-英雄编号,cname-英雄名称,skin_name-所有皮肤名称
(3)再按照图片地址的规律组合成链接发送请求获取图片并下载到本地即可

import time import os import requests # 请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36' } # 王者荣耀英雄资料链接 jsonUrl='https://pvp.qq.com/web201605/js/herolist.json' def getHero(url): """ 获得英雄皮肤 """ res = requests.get(url, headers=headers) # 存在乱码,指定字符编码 # res.encoding = 'gbk' heroList = res.json() # print(res.json()) for hero in heroList: # 获取英雄编号 heroId = hero.get('ename') # 获取英雄名称 heroName = hero.get('cname') # 获取皮肤列表 skinList = hero.get('skin_name').split('|') # 获取皮肤数目 skinNum = len(skinList) # 循环获取英雄皮肤链接 for n in range(1, skinNum+1): skinUrl = 'https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{}/{}-bigskin-{}.jpg'.format(heroId, heroId, n) # 向皮肤链接发送请求 skinRes = requests.get(skinUrl, headers=headers) skinPath = os.path.join(r'英雄皮肤','{}-{}.jpg'.format(heroName, n)) # 将皮肤写入文件 with open(skinPath, 'wb') as f: for line in skinRes.iter_content(): f.write(line) time.sleep(1) print('{} ok'.format(heroName)) # 主动延迟 time.sleep(1) return if not os.path.exists('英雄皮肤'): os.mkdir('英雄皮肤') getHero(jsonUrl)