风萧萧兮易水寒

Python一键获取所有高清无码王者皮肤图片

前言

突然看到王者荣耀每个英雄的图片很不错,所有就一张一张保存了.

分析

1.打开王者荣耀官方英雄列表
2.分析接口
3.实际操作
4.调整代码
5.开始启动程序

开始

其中中间发现,获取的页面中并没有直接找到图片的地址, 所以先拿到皮肤名称拼接成图片链接,然后真正拿到高清无码皮肤图片

# -*- coding: gbk -*-#

# -------------------------------------------------------
# Name:         WZRYImpageDemo
# Description:  多线程获取王者荣耀所有英雄高清皮肤
# Author:       GMaya
# Date:         2020/4/6 14:56
# -------------------------------------------------------
import threading

import requests, json, re

# 创建会话对象
session = requests.session()

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36',
    'origin': 'https://pvp.qq.com'
};


# 获取所有英雄列表
def get_hero_list():
    # 请求接口
    result = session.get('https://pvp.qq.com/web201605/js/herolist.json', headers=headers)
    # 解析json结果
    resJson = json.loads(result.text)
    for res in resJson:
        # 英雄名称
        cname = res.get('cname')
        # 英雄详情页id
        ename = res.get('ename')
        # 多线程获取详细页
        myThread(cname, ename).start()


# 获取英雄详情页面信息
def get_hero_tail(ename, cname):
    # 请求接口
    result = session.get('https://pvp.qq.com/web201605/herodetail/%s.shtml' % ename, headers=headers)
    result.encoding = 'gbk'
    zz = """<ul class="pic-pf-list pic-pf-list3" data-imgname="(.*?)">"""
    # 由于爬取的页面和网页上看到的实际效果不一致,所以这里拿取所有皮肤名称,直接去皮肤服务器拿取
    res_tail = re.findall(zz, result.text)[0]
    res_tail_list = res_tail.split('|')
    count = 1
    for tail in res_tail_list:
        imgName = cname + '-' + tail
        # 下载具体图片
        get_hero_skin(ename, count, imgName)
        count += 1


# 保存下载图片
def get_hero_skin(ename, i, imgName):
    url = "http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/%s/%s-bigskin-%d.jpg" % (ename, ename, i)
    # 拼接最后的图片地址,然后保存
    res_skin = session.get(url)
    file = 'D:\download\爬虫图片目录\王者荣耀图片\%s.jpg' % imgName
    # wb : 以二进制格式打开一个文件只用于写入。一般用于非文本文件如图片等。
    with open(file, 'wb') as f:
        f.write(res_skin.content)


# 创建线程类
class myThread(threading.Thread):
    def __init__(self, cname, ename):
        threading.Thread.__init__(self)
        self.cname = cname
        self.ename = ename

    def run(self):
        print("开始线程:" + self.cname)
        try:
            get_hero_tail(self.ename, self.cname)
        except Exception:
            print('线程出现意外....' + self.name)
        print("退出线程:" + self.cname)


if __name__ == '__main__':
    # 开始
    get_hero_list()

也没有具体的计算, 这三百多个将近四百个, 其中包含英雄本身的图片,所以真正的皮肤应该是200多个.应该是全了.说实话,300kb左右的图片, 已经很清楚了

坚持原创技术分享,您的支持将鼓励我继续创作!