用Python爬取英雄聯(lián)盟(lol)全部皮膚
小三:“怎么了小二?一副無精打采的樣子!”

小二:“唉!別提了,還不是最近又接觸了一個叫英雄聯(lián)盟的游戲,游戲中很多皮膚都需要花錢買,但是我錢不夠呀...”

小三:“咋得,錢攢夠了你還要買呀?還吃不吃飯了?!要我說,你干脆將英雄的炫彩皮膚都爬下來欣賞一下得了,飯錢還給你省下了。”
小二:“你說的也對,畢竟吃飯更重要,那我還是爬取皮膚欣賞一下算了。”

首先,我們打開英雄聯(lián)盟官網(wǎng)主頁,網(wǎng)址為:https://lol.qq.com/main.shtml,然后向下拉,可以看到英雄列表,如圖所示:

接著隨意選一個英雄點擊進入看一下,如圖所示:

再點擊鼠標右鍵,接著選擇檢查,看一下皮膚的 URL,如圖所示:

通過觀察,可以發(fā)現(xiàn)英雄皮膚 URL 組成方式為:https://game.gtimg.cn/images/lol/act/img/skin/big + 英雄id + 皮膚id.jpg。
我們先看皮膚id,也就是看皮膚的個數(shù),選擇開發(fā)者工具的Network項,之后刷新一下頁面,可以發(fā)現(xiàn)有一個17.js的請求,17實際就是英雄id,如圖所示:

再選擇Response項看一下相應(yīng)數(shù)據(jù),如圖所示:

我們可以看到數(shù)據(jù)都顯示在了一行,看著不太方便,我們將其格式化看一下,如圖所示:

通過觀察,可以發(fā)現(xiàn)獲取指定英雄皮膚id的 URL 就是:https://game.gtimg.cn/images/lol/act/img/js/hero/ + 英雄id.js,獲取皮膚id及下載皮膚圖片的代碼實現(xiàn)如下:
hero_skin_url?=?'https://game.gtimg.cn/images/lol/act/img/js/hero/'?+?hero_id?+?'.js'
#?通過?url?獲取英雄的皮膚數(shù)量
skin_text?=?requests.get(hero_skin_url).text
skin_json?=?json.loads(skin_text)
skin_list?=?skin_json['skins']
#?獲取皮膚名
hero_skins.clear()
for?skin?in?skin_list:
????hero_skins.append(skin['name'].replace('/',?'').replace('\\',?'').replace('?',?''))
#?皮膚數(shù)量
skins_num?=?len(hero_skins)
s?=?''
for?i?in?tqdm(range(skins_num),?desc='【'?+?hero_name?+?'】皮膚下載'):
????if?len(str(i))?==?1:
????????s?=?'00'?+?str(i)
????elif?len(str(i))?==?2:
????????s?=?'0'?+?str(i)
????elif?len(str(i))?==?3:
????????pass
????try:
????????#?拼接指定皮膚的?url
????????skin_url?=?'https://game.gtimg.cn/images/lol/act/img/skin/big'?+?hero_id?+?''?+?s?+?'.jpg'
????????img?=?requests.get(skin_url)
????except:
????????#?沒有炫彩皮膚?url?則跳過
????????continue
????#?保存皮膚圖片
????if?img.status_code?==?200:
????????with?open(hero_skins[i]?+?'.jpg',?'wb')?as?f:
????????????f.write(img.content)
現(xiàn)在就差英雄id參數(shù)的獲取了,我們接著看如何獲取全部的英雄id,返回到 https://lol.qq.com/main.shtml頁面,打開開發(fā)者工具并選擇Network,然后刷新頁面,我們可以觀察到有一個hero_list.js的請求,如圖所示:

與皮膚id的獲取基本類似,通過這個請求就可以獲取到全部英雄id,代碼實現(xiàn)如下:
url?=?'https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js'
hero_text?=?requests.get(url).text
#?轉(zhuǎn)為?json?格式
hero_json?=?json.loads(hero_text)['hero']
path?=?os.getcwd()
#?獲取當前文件夾路徑
workspace?=?os.getcwd()
#?皮膚路徑
skin_path?=?"{}\\{}".format(workspace,?'skins')
#?遍歷列表
for?hero?in?hero_json:
????#?將每一個英雄的?id、name?放入一個字典中
????hero_dict?=?{'id':?hero['heroId'],?'name':?hero['name']}
????#?放入列表
????heros.append(hero_dict)
我們可以看出:代碼中除了英雄id,還獲取了英雄name,并將每一個英雄的id、name放在了一個字典中,又將所有英雄對應(yīng)的字典放在了列表中。
最后,我們看一下下載效果:

源碼在公眾號 Python小二 后臺回復(fù) 201130 獲取,有問題可以添加我個人微信號:ityard。
如果覺得有幫助,就給個分享、在看、贊吧~
