这两天闲来无事,恰好有个学弟在学 python,想爬王者的皮肤图片,于是将相干 url 给了我,我帮忙写了一个简略的脚本,分享上来供大家应用。
相干 url
本爬虫程序须要两个 url。
-
保留英雄信息的 JSON 文件:
https://pvp.qq.com/web201605/js/herolist.json
样子长这样,应该是高深莫测:[{ "ename": 105, "cname": "廉颇", "title": "正义爆轰", "new_type": 0, "hero_type": 3, "skin_name": "正义爆轰 | 天堂岩魂" }, { "ename": 106, "cname": "小乔", "title": "恋之大风", "new_type": 0, "hero_type": 2, "skin_name": "恋之大风 | 万圣前夜 | 天鹅之梦 | 纯白花嫁 | 缤纷独角兽" }, { "ename": 107, "cname": "赵云", "title": "苍天翔龙", "new_type": 0, "hero_type": 1, "hero_type2": 4, "skin_name": "苍天翔龙 | 忍●炎影 | 将来纪元 | 皇家上将 | 嘻哈天王 | 白执事 | 引擎之心" }.....
- 获取英雄图片的 url:
https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{英雄编号}/{英雄编号}-bigskin-{皮肤编号}.jpg
这条是什么意思呢?咱们拿小乔举例,下面的 JSON 里,小乔的 ename 是 106,就是这里的英雄编号,而皮肤编号是从 1 开始算的,JSON 里有 5 个皮肤,所以皮肤编号能够是 1 – 5。比方https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/106/106-bigskin-1.jpg
就是小乔的原皮肤。
编码实现
通过观察 JSON 文件,能够发现其是以对象数组的模式存在的,数组中的值就是保留一个英雄信息的对象,如果咱们要获取指定英雄的皮肤,那么就要通过查找英雄的名称【ename】,获取其编号【cname】和皮肤名列表【skin_name】,因为【skin_name】是用“|”连在一起的,所以咱们要宰割字符串,统计其中有几个皮肤,咱们就失去了相应的皮肤编号,而后填入 url 模板中即可。同时咱们也能够将英雄名、皮肤名连接起来,作为下载的图片名称,方便管理。成果如图:
具体代码:
import requests
import os
def save_IMG(hero_id, hero_name, skin_names, path):
# 保留到指定目录,不存在则创立
if not os.path.exists(path):
os.mkdir(path)
if not os.path.exists(path + "/" + hero_name):
os.mkdir(path + "/" + hero_name)
# skin_names 是皮肤名的列表,获取其长度,而后遍历获取它的下标
for i in range(len(skin_names)):
# 获取皮肤的 url 格局如下
img_url = "https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/" + \
str(hero_id) + "/" + str(hero_id) + \
"-bigskin-" + str(i + 1) + ".jpg"
# 发送申请。当 status_code 为 200 时,表明服务器已胜利解决了申请.
response = requests.get(img_url)
if response.status_code == 200:
# 保留在指定文件中,自定义图片名:英雄名 - 皮肤编号 - 皮肤名称
with open(path+'/' + hero_name + "/" + hero_name + "-" + str(i+1) + "-" + skin_names[i] + '.jpg', 'wb') as f:
f.write(response.content)
if __name__ == "__main__":
# 先获取保留英雄信息的 json 文件
url = "https://pvp.qq.com/web201605/js/herolist.json"
header = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
}
response = requests.get(url, headers=header)
hero_list = response.json()
# 咱们须要英雄的编号,名称,以及皮肤名,用于后续拼接 url 和下载
name = input("请输出要爬取的英雄名称:")
for hero_dic in hero_list:
hero_id = hero_dic["ename"]
hero_name = hero_dic["cname"]
skin_names = hero_dic["skin_name"].split("|") # 宰割出皮肤名称
# 如果想爬取全副英雄的皮肤,就不须要判断了,间接遍历列表即可
if hero_name == name:
save_IMG(hero_id, hero_name, skin_names,
"./ 皮肤") # 自定义保留图片的文件夹
break
应用办法:
python .\getSkin.py
请输出要爬取的英雄名称:后羿
输出后会主动生成相应的文件夹,并将皮肤下载到该文件夹内。
如果你想一次性爬取所有皮肤,只须要依照代码正文里说的,去掉名称的判断,遍历整个列表即可。