教你使用几十行代码下载王者荣耀所有皮肤

Python之王

共 3282字,需浏览 7分钟

 ·

2021-10-18 22:46

今天教你使用几十行代码下载王者荣耀所有皮肤,你看我下载的妲己和小乔。

王者荣耀中的皮肤除了好看外,还能影响手感,其实所谓的手感,就是视觉和听觉上的契合,让击打效果表现得更华丽,更契合手感,如果给你个皮肤,技能显示和音效出现延迟,那个手感就不用多说了。

进入正题:如何爬取王者荣耀的英雄皮肤照片?

分为两步:

  • 找到皮肤图片的地址
  • 下载图片

找到皮肤图片的地址

百度“王者荣耀”进入官网,进入https://pvp.qq.com/,按F12进入调试界面,然后按F5刷新界面,图中标识的herolist.json文件就是我们所需要的英雄列表,其中包括英雄编号、英雄名称、英雄类型、皮肤的名称等信息,在文件上右击复制链接http://pvp.qq.com/web201605/js/herolist.json

这样的文件右击在新窗口打开,会直接下载在本地,内容如下:

这里ename不难发现就是英雄id,cname是英雄,skin_name就是皮肤,我们取这三个数据即可,herolist.json的网址是 http://pvp.qq.com/web201605/js/herolist.json

如上分析,我们思路如下:

  • 获取英雄信息:从 http://pvp.qq.com/web201605/js/herolist.json 网址获取英雄名称、id、皮肤名称;-- 获取单个英雄所有皮肤:遍历皮肤名称,英雄id与皮肤序号一起组建皮肤url,发送请求,响应写入文件;
  • 获取所有英雄皮肤:遍历英雄,创建文件夹。

看下面就是我下载的过程:

文件结构

# 爬取王者荣耀游戏皮肤图片
import requests
from bs4 import BeautifulSoup
from urllib import parse
import os


class Skin(object):
    def __init__(self):
        # 英雄的json数据
        self.hero_url = 'https://pvp.qq.com/web201605/js/herolist.json'
        # 英雄详细页的通用url前缀信息
        self.base_url = 'https://pvp.qq.com/web201605/herodetail/'
        # 英雄详细页url后缀信息
        self.detail_url = ''
        # 图片存储文件夹
        self.img_folder = 'skin'
        # 图片url的通用前缀
        self.skin_url = 'https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/'
        # 图片url的后缀信息
        self.skin_detail_url = ''

    def get_hero(self):
        """获取英雄的json数据"""
        request = requests.get(self.hero_url)
        hero_list = request.json()
        return hero_list

    def get_hero_skin(self, hero_name, hero_no):
        """获取详细页英雄皮肤展示的信息,并爬图"""
        url = parse.urljoin(self.base_url, self.detail_url)
        request = requests.get(url)
        request.encoding = 'gbk'
        html = request.text
        # 获取皮肤信息的节点
        soup = BeautifulSoup(html, 'lxml')
        skip_list = soup.select('.pic-pf-list3')
        for skin_info in skip_list:
            # 获取皮肤名称
            img_names = skin_info.attrs['data-imgname']
            name_list = img_names.split('|')
            skin_no = 1
            # 循环下载皮肤图片
            for skin_name in name_list:
                self.skin_detail_url = '%s/%s-bigskin-%s.jpg' % (hero_no, hero_no, skin_no)
                skin_no += 1
                img_name = hero_name + '-' + skin_name + '.jpg'
                self.download_skin(img_name)

    def download_skin(self, img_name):
        """下载皮肤图片"""
        img_url = parse.urljoin(self.skin_url, self.skin_detail_url)
        request = requests.get(img_url)
        if request.status_code == 200:
            print('download-%s' % img_name)
            img_path = os.path.join(self.img_folder, img_name)
            with open(img_path, 'wb') as img:
                img.write(request.content)
        else:
            print('img error!')

    def make_folder(self):
        """创建图片存储文件夹"""
        if not os.path.exists(self.img_folder):
            os.mkdir(self.img_folder)

    def run(self):
        """脚本执行入口"""
        self.make_folder()
        hero_list = self.get_hero()
        for hero in hero_list:
            hero_no = str(hero['ename'])
            self.detail_url = hero_no + '.shtml'
            hero_name = hero['cname']
            self.get_hero_skin(hero_name, hero_no)


# 程序执行入口
if __name__ == '__main__':
    skin = Skin()
    skin.run()



交流学习

如有写的不对或者错误的地方,希望大家指正,相互交流,谢谢。


浏览 50
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报