milu1123 发表于 2024-2-28 13:57

王者荣耀全英雄皮肤

王者荣耀全英雄皮肤。
还有哪位老大抓王者全英雄皮肤代码比这个还少的???
发出来交流交流:lol!!!!
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.split("'")).split('-1')
    j = 1
    for i in pic_pf.split("|"):
      # if os.path.exists('picture/' + cname):
      #   pass
      # else:
      #   os.mkdir('./picture/' + cname)
      if requests.get(f"{a + '-'+str(j) + a}").status_code == 200:
            a_liat = a + '-' + str(j) + a
            # 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)

milu1123 发表于 2024-2-28 14:15

Sen 发表于 2024-2-28 14:07


没理解到你这个操作。。。

爱飞的猫 发表于 2024-2-29 07:25

本帖最后由 爱飞的猫 于 2024-2-29 07:44 编辑

[从 Python 3.2 开始](https://docs.python.org/zh-cn/3.11/library/os.html#os.makedirs),可以直接让它建立目录而无需事先检查是否已经存在:

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

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

```js
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);
```

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

---

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

最后全部整理一下:

```py
#!/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').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

curl https://pvp.qq.com/web201605/js/herolist.json

Love0912 发表于 2024-2-28 14:06

不懂就问,这个有啥用。。

m16yjq 发表于 2024-2-28 14:08

可有成品能用的

milu1123 发表于 2024-2-28 14:14

Love0912 发表于 2024-2-28 14:06
不懂就问,这个有啥用。。

交流,比比看谁的代码更少、:keai

milu1123 发表于 2024-2-28 14:16

m16yjq 发表于 2024-2-28 14:08
可有成品能用的

那你就用成品吧。我说的是交流,比比看谁抓王者荣耀的皮肤代码更少:keai

☆木木可可★ 发表于 2024-2-28 15:14

没明白啥意思,是可以在玩着荣耀里玩所有皮肤?

vicm 发表于 2024-2-28 15:24

不觉明历

hannoch 发表于 2024-2-28 15:48


不觉明历
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 王者荣耀全英雄皮肤