Python例子之下载王者荣耀全部英雄海报

2018-01-13  本文已影响427人  By_syk
王昭君 - 精灵公主 海报

海报来源:王者荣耀官网

# 下载王者荣耀全部英雄海报
# 海报尺寸为 1920x882,截至目前共计 237 张,大小约 60 MB
# author: By_syk <By_syk@163.com>
# date: 2018-01-13


from urllib import request
import json
import os


# 英雄数据URL
URL_HERO = r'https://pvp.qq.com/web201605/js/herolist.json'
# 英雄海报图片URL
URL_HERO_COVER_IMG = r'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/%d/%d-bigskin-%d.jpg'
# 图片存放路径
FOLDER_SAVE = r'E:/Download/QQPVPHeroCover'


def download_cover(hero_id, hero_name, cover_names):
    if not os.path.exists(FOLDER_SAVE):
        os.makedirs(FOLDER_SAVE)

    for i, cover_name in enumerate(cover_names):
        print('downloading:', hero_name, '-', cover_name)
        file_path = '%s/%s-%s.jpg' % (FOLDER_SAVE, hero_name, cover_name)  # 生成图片文件名
        if os.path.exists(file_path):  # 避免重复下载
            continue
        # 样例:http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/152/152-bigskin-2.jpg
        url_img = URL_HERO_COVER_IMG % (hero_id, hero_id, i + 1)  # 生成海报图片URL
        res = request.urlopen(url_img)
        data = res.read()
        with open(file_path, 'wb') as file:
            file.write(data)


def download_all():
    print('start to download')
    res = request.urlopen(URL_HERO)
    data = res.read().decode('utf-8')
    data_json = json.loads(data)
    for hero_data in data_json:
        # 样例:{'ename': 105, 'cname': '廉颇', 'title': '正义爆轰', 'new_type': 0, 'hero_type': 3, 'skin_name': '正义爆轰|地狱岩魂'}
        download_cover(int(hero_data['ename']),
                       hero_data['cname'],
                       hero_data['skin_name'].split('|'))
    print('all done')


if __name__ == '__main__':
    download_all()

完整代码:Github / get_qq_moba_hero_cover

改进 #1

# res = request.urlopen(url_img)
#    data = res.read()
#    with open(file_path, 'wb') as file:
#        file.write(data)
request.urlretrieve(url_img, file_path)

改进 #2

def download_all():
    # ...
    data = res.read().decode('utf-8')
    
    # 移除 UTF-8 BOM 字符,避免 json.loads() 出错
    if data.startswith('\ufeff'):
        data = data.encode('utf-8')[3:].decode('utf-8')

    data_json = json.loads(data)
    # ...

方案2

白起 - 最终兵器 海报
# 下载王者荣耀全部英雄海报
# 海报尺寸可选,截至目前共计 242 张,1080P 大小约 160 MB
# author: By_syk <By_syk@163.com>
# date: 2018-01-25


from urllib import request
import json
import os
import urllib

# 英雄数据URL
# 核心参数:页次 page,每页数量 iListNum
URL_HERO = r'http://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?' \
           r'sDataType=JSON&iActId=2735&iListNum=64&page=%d'
# 图片存放路径
FOLDER_SAVE = r'E:/Download/QQPVPHeroCover/1920x1080'


def download_cover(url_img, hero_and_skin_name):
    if not os.path.exists(FOLDER_SAVE):
        os.makedirs(FOLDER_SAVE)

    name_arr = hero_and_skin_name.split('-')
    hero_name = name_arr[0]
    skin_name = name_arr[1]
    print('downloading:', hero_name, '-', skin_name, end=' ')
    file_path = '%s/%s-%s.jpg' % (FOLDER_SAVE, hero_name, skin_name)  # 生成图片文件名
    if os.path.exists(file_path):  # 避免重复下载
        print('[exists]')
        return
    # 样例:http://shp.qpic.cn/ishow/2735092819/1475060911_1644740874_2501_sProdImgNo_6.jpg/0
    if url_img.endswith('/200'):  # 生成海报图片 URL
        url_img = url_img[:-3] + '0'
    request.urlretrieve(url_img, file_path)
    print('[ok]')


def download_all():
    print('start to download')
    for i in range(0, 10):
        res = request.urlopen(URL_HERO % i)
        data = res.read().decode('utf-8')
        data_json = json.loads(data)
        # data['iTotalLines'] 总数
        core_json = data_json['List']
        if len(core_json) == 0:
            break
        for hero_data in core_json:
            # 壁纸尺寸参数:
            # sProdImgNo_2: 1024x768
            # sProdImgNo_3: 1280x720
            # sProdImgNo_4: 1280x1024
            # sProdImgNo_5: 1440x900
            # sProdImgNo_6: 1920x1080
            # sProdImgNo_7: 1920x1200
            # sProdImgNo_8: 1920x1440
            download_cover(urllib.request.unquote(hero_data['sProdImgNo_6']),
                           urllib.request.unquote(hero_data['sProdName']))
    print('all done')


if __name__ == '__main__':
    download_all()

改进 #1

# file_path = '%s/%s-%s.jpg' % (FOLDER_SAVE, hero_name, skin_name)  # 生成图片文件名
# if os.path.exists(file_path):  # 避免重复下载
#     print('[exists]')
#     return
file_path = '%s/%s-%s.jpg' % (FOLDER_SAVE, hero_name, skin_name)  # 生成图片文件名
file_path_alt = '%s/%s-%s.jpg' % (FOLDER_SAVE, skin_name, hero_name)  # 用于除重
if os.path.exists(file_path) | os.path.exists(file_path_alt):  # 避免重复下载
    print('[exists]')
    return
上一篇下一篇

猜你喜欢

热点阅读