Python獲取英雄聯盟皮膚原畫:新手玩家們都懵了!

Python方正發表於2020-10-10

本爬蟲是為了經驗交流,喜歡博主的讀者,可以點個關注~,更多精彩內容*

爬蟲過程
* 分析網頁
* 獲取每一位英雄的ID值
* 分析原畫網頁

  • 結語

前言

在本次的爬蟲教程的過程中,我也會分享給大家一些簡單實用的爬蟲小技巧。

夜太美,爬蟲就沒那麼危險

在爬取的時候,不要猛攻嘛~,啊啊。。人家伺服器受不了啊。。。

你要學會停頓,剋制一點,該 sleep 就 sleep。

趁著人家睡覺的時候,限制防範程度是最低的,能晚點就晚點爬,沒有看過凌晨4點的洛杉磯,但是你還可以看到凌晨4點的爬蟲呢。

這樣你的IP地址才不會容易被封。

善於利用他人的UA

如果你在看別人網站的robots.txt,你就會看到別人的宣告,宣告什麼內容可以爬,什麼內容不可以爬。但是,不要忽略了人家的宣告,希望給什麼搜尋引擎爬,比如下面這個

看到沒,這個別人定義的robots.txt值得注意的是 User-Agent ,那麼當你在Python構造headers的時候,User-Agent就直接指定它們的robots定義的就好了啊,比如:百度的UA,Google的UA或者是搜狗的UA等等。你再去爬爬看,那叫一個友好啊。

爬蟲過程

分析網頁

通過開發者模式F12,你就會發現箭頭所指的檔案了,沒有看到的話,重新整理一下試試。

新手學習,Python 教程/工具/方法/解疑+V:itz992
`url0 = 'https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js'
try:
 response = requests.get(url0, headers=headers)
 response.raise_for_status()
 response.encoding = response.apparent_encoding  # 設定編碼格式
 hreolist = response.json() # 將Response轉換成json格式
 print(hreolist) # 列印出英雄列表
 print(len(hreolist['hero']))    # 列印英雄個數:151
except Exception as e:
 print(e)

通過上面的程式碼,我成功的獲取到了所有的英雄,以及英雄的總個數。

這裡只是擷取部分的列印資訊

`{'hero': [{'heroId': '1', 'name': '黑暗之女', 'alias': 'Annie', 'title': '安妮', 'roles': ['mage'], 'isWeekFree': '0', 'attack': '2', 'defense': '3', 'magic': '10', 'difficulty': '6', 'selectAudio': 'https://game.gtimg.cn/images/lol/act/img/vo/choose/1.ogg', 'banAudio': 'https://game.gtimg.cn/images/lol/act/img/vo/ban/1.ogg', 'isARAMweekfree': '0', 'ispermanentweekfree': '0', 'changeLabel': '無改動', 'goldPrice': '4800', 'couponPrice': '2000', 'camp': '', 'campId': '', 'keywords': '安妮,黑暗之女,火女,Annie,anni,heianzhinv,huonv,an,hazn,hn'}

通過上面的json資訊其實你會發現,英雄的列表資訊是寫在了hero下的。

獲取每一位英雄的ID值

通過剛剛獲取到的json值,你會發現,這些值裡面有一個鍵: ‘heroId’ ,那麼這個’heroId’是用來做什麼的呢?

這個我開始是不知道的,接下來我進入到了皮膚原畫的網址,馬上就霍然開朗了

https://lol.qq.com/data/info-defail.shtml?id=1 安妮
https://lol.qq.com/data/info-defail.shtml?id=2 奧拉夫
https://lol.qq.com/data/info-defail.shtml?id=876 莉莉婭 

通過上面的三個URL地址你就會發現heroId就是一個查詢引數id。

但是在這裡有一個坑,想必你也看到了,英雄的個數只有151個,id值卻是876,。沒錯,在前100多個英雄都不會有什麼問題很有規律,但是100多之後就出現問題了,每個英雄的id值跳轉的很多,所以要進入每一位英雄的原畫去爬圖片就必須要正確拼接URL。每位英雄的ID值獲取就成了必不可少的一步。

url = 'https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js'
hero_list_json = hreolist
hero_lists = hero_list_json['hero']     # 獲取英雄列表
heros_id = list(map(lambda x: x['heroId'], hero_lists))     # 獲取英雄編號 

分析原畫網頁

開啟開發者模式,你會發現一個檔案

在上圖中可以看到skins有10個值,點開第一個可以看到 loadingImg ,而這個鍵對應的值就是皮膚原畫的URL地址。

當然,作為老玩家們都知道,莉莉婭只有兩種皮膚,但是skins裡面為什麼有10個值,依次點開第三個至第十個,會發現其餘的loadingImg的值都是空的。

url_list = []   # 儲存每一位英雄資訊的url地址
for hero_id in heros_id:
 url = 'https://game.gtimg.cn/images/lol/act/img/js/hero/{}.js'.format(hero_id)
 # print(url)
 url_list.append(url) 

url1 = 'https://game.gtimg.cn/images/lol/act/img/js/hero/876.js'
try:
 response = requests.get(url1, headers=headers)
 response.raise_for_status()
 response.encoding = response.apparent_encoding  # 設定編碼格式
 hreo_info = response.json()
 skins = hreo_info['skins']  # 獲取英雄皮膚資訊
 # 遍歷每一個皮膚的loadingImg與皮膚名稱
 for skin in skins:
 print(skin['loadingImg'])
 print(skin['name'])
 except Exception as e:
 print(e) 
新手學習,Python 教程/工具/方法/解疑+V:itz992

通過上面的兩組程式碼的思路,那麼已經可以實現一個英雄的皮膚原畫的爬取了,需要獲取所有的皮膚原畫,無非就是多一個迴圈。

當你會爬第一個英雄的原畫時,你還怕得不到其他英雄嗎?

結語

爬取英雄聯盟的英雄原畫的思路已經分享給大家了。

請問親愛的讀者,你是否可以將王者榮耀的英雄皮膚全部拿下呢?

相關文章