首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用Python完成对王者荣耀英雄全皮肤的下载

利用Python完成对王者荣耀英雄全皮肤的下载

作者头像
python学习教程
发布2019-09-06 10:29:22
5960
发布2019-09-06 10:29:22
举报
文章被收录于专栏:python学习教程python学习教程

本文使用python的第三方模块requests爬取王者荣耀所有英雄的图片,并将图片按每个英雄为一个目录存入文件夹中,方便用作桌面壁纸。

基本环境配置

版本:Python3

系统:Windows

相关模块:requests

安装模块:

pip install requests

完整代码

# -*- coding: utf-8 -*-
"""
Created on Wed Dec 13 13:49:52 2017

@author:KillerTwo
"""
import requests
import os
hero_list_url = 'http://pvp.qq.com/web201605/js/herolist.json'
hero_skin_root_url = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/'
skin_base_dir = 'C:\\Users\\lwt27\\Pictures\\image\\heroskin\\'


def get_ename(hero_json):#传入获取到的python对象,如hero_list_json
    '''获取英雄名称对应英雄编号的一个字典,例如{小乔:106,...}'''
    cname_ename = {}
    for hero in hero_json:
        cname_ename[hero['cname']] = hero['ename']
    return cname_ename

def get_skin_name(hero_json): #传入从网页获取到的json转换为python字典的对象
    '''获取英雄名称对应的皮肤的所有皮肤名称的字典,例如
    {'小乔':'恋之微风|万圣前夜|天鹅之梦|纯白花嫁|缤纷独角兽',...}'''
    cname_skin_name = {}
    for hero in hero_json:
        cname_skin_name[hero['cname']] = hero['skin_name']
    return cname_skin_name

def get_hero_skin_count(cname_skin_name): #传入英雄名称对应皮肤名称的字典
    '''获取每个英雄对应的皮肤的个数,例如{'小乔':5,...}'''
    cname_skin_count = {} 
    for item in cname_skin_name.items():
        cname_skin_count[item[0]] = len(item[1].split('|'))
    return cname_skin_count

def get_skin_name_url(skin_base_rul,cname_skin_count,cname_ename):
    #传入皮肤根地址和名称对应皮肤数量的字典和名称对应编号的字典
    '''返回英雄名称对应的所有皮肤的url地址列表的字典,例如{小乔:[skin_url1,skin_url2],...}'''
    cname_url_list = {}
    for cname,count in cname_skin_count.items():
        #print(cname)
        #print(count)
        #print(skin_base_rul)
        #print(cname_ename[cname])
        base_url = skin_base_rul+str(cname_ename[cname])+'/'+str(cname_ename[cname])+'-bigskin-'
        #print(base_url)
        skin_url_list = [str(base_url)+str(num)+'.jpg' for num in range(1,count+1)]
        cname_url_list[cname] = skin_url_list
    return cname_url_list

#print()
d = get_skin_name_url(hero_skin_root_url,get_hero_skin_count(get_skin_name(hero_list_json)),get_ename(hero_list_json))
#print(d)

def get_cname_skin_name(cname_skin_name):#传入名称对应皮肤名称字符串的字典
    cname_skin_name_dict = {}         #返回名称对应【皮肤名称的列表】的字典
    for cname,skin_name_list in cname_skin_name.items():
        skin_list = [name for name in skin_name_list.split('|')]
        cname_skin_name_dict[cname] = skin_list
    return cname_skin_name_dict
    
#s = get_skin_name(hero_list_json)
#print(s)
#f = get_cname_skin_name(s)
#print(f)

def get_hero_skin(cname_url_list,cname_skin_name):#传入名称对应【皮肤名称列表】的字典和名称对应皮肤url列表的字典
   # """获取每个英雄的图片"""
    for cname,skin_url in cname_url_list.items():
        
        if mkdir(skin_base_dir+cname):#创建指定目录
            os.chdir(skin_base_dir+cname)  #进入到创建的目录
            
            for i in range(len(skin_url)):
                file_name = cname_skin_name[cname][i]+'.jpg'
                r = requests.get(skin_url[i])
                with open(file_name,'wb') as f:
                    f.write(r.content)
#创建目录
def mkdir(path):
    # 引入模块
    import os
    # 去除首位空格
    path=path.strip()
    # 去除尾部 \ 符号
    path=path.rstrip("\\")
    # 判断路径是否存在
    # 存在     True
    # 不存在   False
    isExists=os.path.exists(path)
    # 判断结果
    if not isExists:
        # 如果不存在则创建目录
        # 创建目录操作函数
        os.makedirs(path)
        print(path+' 创建成功')
        return True
    else:
        # 如果目录存在则不创建,并提示目录已存在
        print(path+' 目录已存在')
        return False
    return 

if __name__ == '__main__':
    
    hero_list_body = requests.get(hero_list_url) #请求英雄列表
    hero_list_json = hero_list_body.json()  #将英雄列表的获取的json数据转换为python对象

    cname_ename = {}       #英雄名称对应英雄编号的字典
    cname__skin_name = {} #英雄名称对应皮肤名称字符串的字典
    cname_skin_count = {} #英雄名称对应皮肤数量的字典
    
    cname_skin_name_str_list = get_skin_name(hero_list_json)
    cname_skin_name_list = get_cname_skin_name(cname_skin_name_str_list)
    cname_skin_count = get_hero_skin_count(cname_skin_name_str_list)
    cname_ename = get_ename(hero_list_json)
    cnam_skin_url_list = get_skin_name_url(hero_skin_root_url,cname_skin_count,cname_ename)
    get_hero_skin(cnam_skin_url_list,cname_skin_name_list)

下面是保存抓取到的图片的文件夹样例:

以上就是抓取王者荣耀所有英雄皮肤的简单示例,上述的代码并没有使用python多线程执行抓取图片的函数,所以在执行的时候可能需要花费几分钟的时间。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python教程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基本环境配置
  • 完整代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档