用Python爬取英雄聯盟(lol)全部面板
阿新 • • 發佈:2020-11-30
小三:“怎麼了小二?一副無精打采的樣子!”
![](https://img2020.cnblogs.com/blog/1497257/202011/1497257-20201130203433362-343894738.jpg)
小二:“唉!別提了,還不是最近又接觸了一個叫英雄聯盟的遊戲,遊戲中很多面板都需要花錢買,但是我錢不夠呀...”
![](https://img2020.cnblogs.com/blog/1497257/202011/1497257-20201130203444015-672342219.jpg)
小三:“咋得,錢攢夠了你還要買呀?還吃不吃飯了?!要我說,你乾脆將英雄的炫彩面板都爬下來欣賞一下得了,飯錢還給你省下了。”
小二:“你說的也對,畢竟吃飯更重要,那我還是爬取面板欣賞一下算了。”
![](https://img2020.cnblogs.com/blog/1497257/202011/1497257-20201130203457340-519785072.png)
首先,我們開啟英雄聯盟官網主頁,網址為:`https://lol.qq.com/main.shtml`,然後向下拉,可以看到英雄列表,如圖所示:
![](https://img2020.cnblogs.com/blog/1497257/202011/1497257-20201130203507110-1846242071.png)
接著隨意選一個英雄點選進入看一下,如圖所示:
![](https://img2020.cnblogs.com/blog/1497257/202011/1497257-20201130203517025-1658942364.png)
再點選滑鼠右鍵,接著選擇`檢查`,看一下面板的 URL,如圖所示:
![](https://img2020.cnblogs.com/blog/1497257/202011/1497257-20201130203529141-1625312923.png)
通過觀察,可以發現英雄面板 URL 組成方式為:`https://game.gtimg.cn/images/lol/act/img/skin/big + 英雄id + 面板id.jpg`。
我們先看`面板id`,也就是看面板的個數,選擇開發者工具的`Network`項,之後重新整理一下頁面,可以發現有一個`17.js`的請求,`17`實際就是`英雄id`,如圖所示:
![](https://img2020.cnblogs.com/blog/1497257/202011/1497257-20201130203539688-169951236.png)
再選擇`Response`項看一下相應資料,如圖所示:
![](https://img2020.cnblogs.com/blog/1497257/202011/1497257-20201130203549426-1783138535.png)
我們可以看到資料都顯示在了一行,看著不太方便,我們將其格式化看一下,如圖所示:
![](https://img2020.cnblogs.com/blog/1497257/202011/1497257-20201130203559180-1951428715.png)
通過觀察,可以發現獲取指定英雄`面板id`的 URL 就是:`https://game.gtimg.cn/images/lol/act/img/js/hero/ + 英雄id.js`,獲取`面板id`及下載面板圖片的程式碼實現如下:
```python
hero_skin_url = 'https://game.gtimg.cn/images/lol/act/img/js/hero/' + hero_id + '.js'
# 通過 url 獲取英雄的面板數量
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(' ', ''))
# 面板數量
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)
```
現在就差`英雄id`引數的獲取了,我們接著看如何獲取全部的`英雄id`,返回到 `https://lol.qq.com/main.shtml`頁面,開啟開發者工具並選擇`Network`,然後重新整理頁面,我們可以觀察到有一個`hero_list.js`的請求,如圖所示:
![](https://img2020.cnblogs.com/blog/1497257/202011/1497257-20201130203609711-758596665.png)
與`面板id`的獲取基本類似,通過這個請求就可以獲取到英雄的全部`英雄id`,程式碼實現如下:
```python
url = 'https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js'
hero_text = requests.get(url).text
# 轉為 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`放在了一個字典中,又將所有英雄對應的字典放在了列表中。
最後,我們看一下下載效果:
![](https://img2020.cnblogs.com/blog/1497257/202011/1497257-20201130203622418-1042575599.gif)
原始碼在公眾號 **Python小二** 後臺回覆 **201130**