王者榮耀皮膚
1.由於需要的是英雄皮膚,先進入英雄資料頁面。
2.這個頁面沒有英雄皮膚,而且雲中君以前的英雄是動態加載的。
3.加載頁面時向這個地址發送了請求,返回的響應有大量相同格式的Json字符串,結合這個命名猜測是全部英雄信息
4.點開英雄詳情看一下,地址欄里出現類似英雄編號的數字,我的猜想可能是正確的,而且看到了有英雄皮膚
5.鼠標放在小圖上時,背景的高清大圖地址隨之加載
6.經查看,這里的地址就是我們需要的皮膚大圖
7.查找一下可以發現規律,地址中的506是英雄編號,2是皮膚編號,所以無需向英雄詳情頁發送請求
https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/506/506-bigskin-2.jpg
8.那么問題來了,如何知道一個英雄有幾個皮膚呢
這里可以回到英雄列表頁面的響應看一下,這里是皮膚名稱,以|分割
獲取的時候輸出一下可以看到這樣就能獲得英雄皮膚數目
9.現在大致的流程就清楚了
(1)先發送請求獲取英雄列表的信息
(2)提取其中的ename-英雄編號,cname-英雄名稱,skin_name-所有皮膚名稱
(3)再按照圖片地址的規律組合成鏈接發送請求獲取圖片並下載到本地即可

import time import os import requests # 請求頭 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36' } # 王者榮耀英雄資料鏈接 jsonUrl='https://pvp.qq.com/web201605/js/herolist.json' def getHero(url): """ 獲得英雄皮膚 """ res = requests.get(url, headers=headers) # 存在亂碼,指定字符編碼 # res.encoding = 'gbk' heroList = res.json() # print(res.json()) for hero in heroList: # 獲取英雄編號 heroId = hero.get('ename') # 獲取英雄名稱 heroName = hero.get('cname') # 獲取皮膚列表 skinList = hero.get('skin_name').split('|') # 獲取皮膚數目 skinNum = len(skinList) # 循環獲取英雄皮膚鏈接 for n in range(1, skinNum+1): skinUrl = 'https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{}/{}-bigskin-{}.jpg'.format(heroId, heroId, n) # 向皮膚鏈接發送請求 skinRes = requests.get(skinUrl, headers=headers) skinPath = os.path.join(r'英雄皮膚','{}-{}.jpg'.format(heroName, n)) # 將皮膚寫入文件 with open(skinPath, 'wb') as f: for line in skinRes.iter_content(): f.write(line) time.sleep(1) print('{} ok'.format(heroName)) # 主動延遲 time.sleep(1) return if not os.path.exists('英雄皮膚'): os.mkdir('英雄皮膚') getHero(jsonUrl)