吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7616|回复: 98
上一主题 下一主题
收起左侧

[Python 原创] 王者荣耀全英雄皮肤

[复制链接]
跳转到指定楼层
楼主
milu1123 发表于 2024-2-28 13:57 回帖奖励
王者荣耀全英雄皮肤。
还有哪位老大抓王者全英雄皮肤代码比这个还少的???
发出来交流交流!!!!
[Python] 纯文本查看 复制代码
import os
from urllib.parse import urljoin
import requests
from lxml import etree

def id_name1(ID_list, cname):
    if os.path.exists('picture'):
        pass
    else:
        os.mkdir('picture')
    resp = requests.get(ID_list)
    resp.encoding = resp.apparent_encoding
    curr = etree.HTML(resp.text)
    src = curr.xpath("//div[@class='zk-con1 zk-con']/@style")
    pic_pf = curr.xpath("//div[@class='pic-pf']/ul/@data-imgname")
    a = urljoin(ID_list, src[0].split("'")[1]).split('-1')
    j = 1
    for i in pic_pf[0].split("|"):
        # if os.path.exists('picture/' + cname):
        #     pass
        # else:
        #     os.mkdir('./picture/' + cname)
        if requests.get(f"{a[0] + '-'+str(j) + a[1]}").status_code == 200:
            a_liat = a[0] + '-' + str(j) + a[1]
            # with open("./picture/" + cname + "/" + i + ".jpg", "wb") as f:
            #     f.write(requests.get(a_liat).content)
            #     print("下载好了", i)
            print(a_liat, cname, i)
        j += 1

def main(url):
    resp = requests.get(url)
    resp.encoding = resp.apparent_encoding
    for i in resp.json():
        yingxiong = f"https://pvp.qq.com/web201605/herodetail/{i['id_name']}.shtml"
        id_name1(yingxiong, i['cname'])

if __name__ == '__main__':
    url = 'https://pvp.qq.com/web201605/js/herolist.json'
    main(url)

免费评分

参与人数 3吾爱币 +3 热心值 +1 收起 理由
Yang777 + 1 我很赞同!
yuan03 + 1 + 1 我很赞同!
heyifan00 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
 楼主| milu1123 发表于 2024-2-28 14:15 |楼主

没理解到你这个操作。。。
推荐
爱飞的猫 发表于 2024-2-29 07:25
本帖最后由 爱飞的猫 于 2024-2-29 07:44 编辑

从 Python 3.2 开始,可以直接让它建立目录而无需事先检查是否已经存在:

os.makedirs('image_path', exist_ok=True)

另外,看了下英雄介绍的 html 页面,其中背景图片地址是可以根据 id 来拼接的:

burl = "//game.gtimg.cn/images/yxzj/img201606/skin/hero-info/" + ename + '/' + ename // 背景图的前缀

function wrap(a, b) {
  for (var i = a; i < b; i++) {
    var bskin = burl + "-bigskin-" + (i + 1) + ".jpg"; // 拼接
    // 无关内容省略
  };
}

wrap(0, skins.length);

不用爬页面获取地址,又能省几行。


不过重要的并不是多少行,也要考虑代码的可读性 - 使用各种单字符的变量名可能现在还记得,过一段时间再看可能就不记得了。

最后全部整理一下:

#!/usr/bin/env python3

import os, re, requests, lxml.html

# 根据英雄 ID (ename) 和皮肤索引 (从 1 开始) 来获取对应的皮肤背景图片地址
def get_hero_skin_url(ename, index):
    return f'https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{ename}/{ename}-bigskin-{index}.jpg'

# 下载英雄皮肤数据到 `./picture/英雄名称` 目录下
def download_skin(hero, name_suffix=''):
    # 初始化一些变量
    hero_url = f"https://pvp.qq.com/web201605/herodetail/{hero['id_name']}.shtml"
    ename = hero['ename']
    cname = hero['cname']

    # 确保图片下载目录存在
    os.makedirs(f'picture/{cname}', exist_ok=True)

    # 解析页面信息
    doc = lxml.html.fromstring(requests.get(hero_url).content)

    # 解析皮肤名称
    skin_names = doc.find_class('pic-pf-list')[0].get('data-imgname')
    skin_names = re.sub(r'&\d*', '', skin_names)
    skin_names = skin_names.split("|")

    # 依次下载皮肤图片
    for (i, skin_name) in enumerate(skin_names, start=1):
        print(f'\33[2K正在下载: {cname}{name_suffix} -- {skin_name} ({i}/{len(skin_names)})\r', end='')
        resp = requests.get(get_hero_skin_url(ename, i))
        resp.raise_for_status() # 若是请求失败,抛出错误
        with open(f'picture/{cname}/{i:02d}-{skin_name}.jpg', 'wb') as f:
            f.write(resp.content)

    print(f'\33[2K下载完成: {cname}{name_suffix}')

# 地址可选,默认为英雄列表 JSON 数据。
def main(url = 'https://pvp.qq.com/web201605/js/herolist.json'):
    hero_data = requests.get(url).json()
    for (i, hero) in enumerate(hero_data, start=1):
        download_skin(hero, f' ({i}/{len(hero_data)})')

if __name__ == '__main__':
    main()

P.S. 可以尝试加入多线程下载

推荐
Sen 发表于 2024-2-28 14:07
[Shell] 纯文本查看 复制代码
curl [url]https://pvp.qq.com/web201605/js/herolist.json[/url]
推荐
Love0912 发表于 2024-2-28 14:06
不懂就问,这个有啥用。。
5#
m16yjq 发表于 2024-2-28 14:08
可有成品能用的
6#
 楼主| milu1123 发表于 2024-2-28 14:14 |楼主
Love0912 发表于 2024-2-28 14:06
不懂就问,这个有啥用。。

交流,比比看谁的代码更少、
7#
 楼主| milu1123 发表于 2024-2-28 14:16 |楼主
m16yjq 发表于 2024-2-28 14:08
可有成品能用的

那你就用成品吧。我说的是交流,比比看谁抓王者荣耀的皮肤代码更少
8#
☆木木可可★ 发表于 2024-2-28 15:14
没明白啥意思,是可以在玩着荣耀里玩所有皮肤?
9#
vicm 发表于 2024-2-28 15:24
不觉明历
10#
hannoch 发表于 2024-2-28 15:48

不觉明历
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 09:07

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表