本文手把手教你使用Python擼取所有王者榮耀全皮膚高清壁紙的全過程~~~,代碼僅30余行,可簡單上手實操。
開篇
前幾天看到同事的桌面壁紙是王者榮耀的炫酷后羿皮膚蝉揍,覺得十分帥氣啃炸,于是想自己也弄一個,可是王者皮膚這么多一個個點網頁找太費勁加派,何不一把擼下來一起看呢阁簸,于是想著把所有的英雄皮膚都下載到本地的一個目錄下面慢慢選多好,說干就干....那我們就開始吧哼丈。
網頁分析
首先启妹,我們進去王者榮耀官網,點進“英雄資料”界面:
按F12打開調試臺醉旦,隨便點擊一個英雄如后翌饶米,找到英雄原皮膚的圖片地址:
鼠標在英雄的不同皮膚頭像上滑動,發(fā)現圖片的url地址會發(fā)生變化车胡,但是只有最后一個數字在改變檬输,進一步發(fā)現皮膚號是從1,2,3...一直往后編的。好了找到了圖片的編碼規(guī)律匈棘,下面我們再看看不同英雄的圖片url地址有什么不同丧慈。
我們回到“英雄資料”界面,點擊另外一個英雄露娜,對比一下后羿與露娜英雄壁紙的url地址逃默,發(fā)現僅僅有一個數字是不相同的鹃愤,后羿是169,露娜是146完域,如下所示软吐。因此我們猜測這個數字應該是代表的英雄編號。
# 后羿圖片url: 'game.gtimg.cn/images/yxzj/img201606/skin/heroinfo/169/169-bigskin-1.jpg'
# 露娜圖片url: 'game.gtimg.cn/images/yxzj/img201606/skin/heroinfo/146/146-bigskin-1.jpg'
繼續(xù)回到英雄資料的界面吟税,按F5刷新界面凹耙,看到有一個herolist.json的文件:
將herolist.json文件下載下來打開一看如下圖,發(fā)現后翌的編號就是169肠仪。至此肖抱,我們已經完成了我們的分析工作,圖片的url地址以及英雄的編號還有皮膚名稱也都有了异旧,下面來把照片打包擼下來吧虐沥。
編碼實現
首先下載herolist.json文件,獲取文件內容泽艘,并解析:
# 英雄編號及皮膚信息
hero_list_url = 'https://pvp.qq.com/web201605/js/herolist.json'
# 發(fā)送get請求獲取數據
hero_list = requests.get(hero_list_url)
# 將獲取json數據
hero_list_json = hero_list.json()
進行英雄編號以及圖片編號的url拼接:
http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{}/{}-bigskin-{}.jpg'.format(hero_num, hero_num, pic_num)
欲险,其中hero_num
表示英雄編號,pic_num
表示圖片編號匹涮,從1開始天试。
解析herolist.json,并進行圖片下載然低,為了防止被檢測出來是爬蟲喜每,每次下載圖片隨機間隔0-1秒之間的時間,圖片存儲名稱為英雄名_皮膚名稱.jpg
雳攘。
for each_hero in hero_list_json:
hero_name = each_hero['cname'] # 獲取英雄名稱
hero_num = each_hero['ename'] # 獲取英雄編號
# 獲取該英雄的皮膚名稱列表
skin_name_list = each_hero.get('skin_name').split('|')if each_hero.get('skin_name') else []
for i in range(10):
pic_num = i + 1 # 圖片編號是從1開始的
# # 有些圖片在json文件中沒寫皮膚名稱, 就將皮膚名稱標為未知
skin_name = skin_name_list[i] if i <= len(skin_name_list) else '未知{}'.format(i)
pic_link = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{}/{}-bigskin-{}.jpg'.format(hero_num, hero_num, pic_num)
request_res = requests.get(pic_link)
img_path_name = os.path.join(save_path_pre,'{}_{}.jpg'.format(hero_name, skin_name))
if request_res.status_code == 200:
with open(img_path_name, 'wb') as f:
f.write(request_res.content)
all_skin_counts += 1
print('第{}張下載成功: {}|{}'.format(all_skin_counts,hero_name, skin_name))
time_rand = random.random()
time.sleep(time_rand) #隨機間隔0-1秒的時間带兜,防止被檢測出來是爬蟲
完整代碼如下:
import os
import requests
import time
import random
# 英雄編號及皮膚信息
hero_list_url = 'https://pvp.qq.com/web201605/js/herolist.json'
# 發(fā)送get請求獲取數據
hero_list = requests.get(hero_list_url)
# 將獲取json數據
hero_list_json = hero_list.json()
# 存儲目錄,須在本地創(chuàng)建
save_path_pre = 'F:/wzry_heropics'
if not os.path.exists(save_path_pre):
os.makedirs(save_path_pre)
all_skin_counts = 0
for each_hero in hero_list_json:
hero_name = each_hero['cname'] # 獲取英雄名稱
hero_num = each_hero['ename'] # 獲取英雄編號
# 獲取該英雄的皮膚名稱列表
skin_name_list = each_hero.get('skin_name').split('|')if each_hero.get('skin_name') else []
for i in range(10):
pic_num = i + 1 # 圖片編號是從1開始的
# # 有些圖片在json文件中沒寫皮膚名稱, 就將皮膚名稱標為未知
skin_name = skin_name_list[i] if i <= len(skin_name_list) else '未知{}'.format(i)
pic_link = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{}/{}-bigskin-{}.jpg'.format(hero_num,hero_num,pic_num)
request_res = requests.get(pic_link)
# 圖片存儲路徑
img_path_name = os.path.join(save_path_pre,'{}_{}.jpg'.format(hero_name, skin_name))
if request_res.status_code == 200:
with open(img_path_name, 'wb') as f:
f.write(request_res.content)
all_skin_counts += 1
print('第{}張下載成功: {}|{}'.format(all_skin_counts,hero_name, skin_name))
time_rand = random.random()
time.sleep(time_rand) #隨機間隔0-1秒的時間吨灭,防止被檢測出來是爬蟲
好了刚照,爽了,終于搞定了喧兄。最終成功擼下了全部的427張
高清全英雄皮膚照片无畔,成果如下:
哈哈,終于可以方便的選擇自己喜歡的高清皮膚壁紙當桌面啦~~~
特別說明:本文僅供技術交流吠冤,切勿用作非法或者商業(yè)用途浑彰。
如果喜歡本文,歡迎點贊 并 關注作者拯辙,后續(xù)將會不斷更新干貨文章郭变,以供大家共同學習交流,謝謝!