前言
作為喜歡讀書的我,也是很喜歡打遊戲的,之前看到有人爬王者榮耀的皮膚的,我可是王者榮耀的老玩家了,所以我把英雄聯盟給爬了。
哈哈哈,沒想到吧!
在本次的爬蟲教程的過程中,我也會分享給大家一些簡單實用的爬蟲小技巧。
夜太美,爬蟲就沒那麼危險
在爬取的時候,不要猛攻嘛~,啊啊。。人家服務器受不了啊。。。
你要學會停頓,剋制一點,該 sleep 就 sleep。
趁着人家睡覺的時候,限制防範程度是最低的,能晚點就晚點爬,沒有看過凌晨4點的洛杉磯,但是你還可以看到凌晨4點的爬蟲呢。
這樣你的IP地址才不會容易被封。
這裡多說一句,小編是一名python開發工程師,這裡有我自己整理了一套最新的python系統學習教程,包括從基礎的python腳本到web開發、爬蟲、數據分析、數據可視化、機器學習等。想要這些資料的可以關注小編,並私信“01”領取。
善於利用他人的UA
如果你在看別人網站的robots.txt,你就會看到別人的聲明,聲明什麼內容可以爬,什麼內容不可以爬。但是,不要忽略了人家的聲明,希望給什麼搜索引擎爬,比如下面這個
看到沒,這個別人定義的robots.txt值得注意的是User-Agent,那麼當你在Python構造headers的時候,User-Agent就直接指定它們的robots定義的就好了啊,比如:百度的UA,Google的UA或者是搜狗的UA等等。你再去爬爬看,那叫一個友好啊。
爬蟲過程
分析網頁
通過開發者模式F12,你就會發現箭頭所指的文件了,沒有看到的話,刷新一下試試。
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'是用來做什麼的呢?
這個我開始是不知道的,接下來我進入到了皮膚原畫的網址,馬上就霍然開朗了
安妮
奧拉夫
莉莉婭
複製代碼
通過上面的三個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)
複製代碼
通過上面的兩組代碼的思路,那麼已經可以實現一個英雄的皮膚原畫的爬取了,需要獲取所有的皮膚原畫,無非就是多一個循環。
當你會爬第一個英雄的原畫時,你還怕得不到其他英雄嗎?
結語
爬取英雄聯盟的英雄原畫的思路已經分享給大家了。
請問親愛的讀者,你是否可以將王者榮耀的英雄皮膚全部拿下呢?
相信你絕對是沒有問題的,加油!
原創文章,作者:編程阿喵,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/345113.html