前言
作為喜歡讀書的我,也是很喜歡打游戲的,之前看到有人爬王者榮耀的皮膚的,我可是王者榮耀的老玩家了,所以我把英雄聯(lián)盟給爬了。
哈哈哈,沒想到吧!
在本次的爬蟲教程的過程中,我也會(huì)分享給大家一些簡(jiǎn)單實(shí)用的爬蟲小技巧。
夜太美,爬蟲就沒那么危險(xiǎn)
在爬取的時(shí)候,不要猛攻嘛~,啊啊。。人家服務(wù)器受不了啊。。。
你要學(xué)會(huì)停頓,克制一點(diǎn),該 sleep 就 sleep。
趁著人家睡覺的時(shí)候,限制防范程度是最低的,能晚點(diǎn)就晚點(diǎn)爬,沒有看過凌晨4點(diǎn)的洛杉磯,但是你還可以看到凌晨4點(diǎn)的爬蟲呢。
這樣你的IP地址才不會(huì)容易被封。
?

這里多說一句,小編是一名python開發(fā)工程師,這里有我自己整理了一套最新的python系統(tǒng)學(xué)習(xí)教程,包括從基礎(chǔ)的python腳本到web開發(fā)、爬蟲、數(shù)據(jù)分析、數(shù)據(jù)可視化、機(jī)器學(xué)習(xí)等。想要這些資料的可以進(jìn)裙930900780領(lǐng)取。
善于利用他人的UA
如果你在看別人網(wǎng)站的robots.txt,你就會(huì)看到別人的聲明,聲明什么內(nèi)容可以爬,什么內(nèi)容不可以爬。但是,不要忽略了人家的聲明,希望給什么搜索引擎爬,比如下面這個(gè)
?

看到?jīng)],這個(gè)別人定義的robots.txt值得注意的是User-Agent,那么當(dāng)你在Python構(gòu)造headers的時(shí)候,User-Agent就直接指定它們的robots定義的就好了啊,比如:百度的UA,Google的UA或者是搜狗的UA等等。你再去爬爬看,那叫一個(gè)友好啊。
爬蟲過程
分析網(wǎng)頁(yè)
通過開發(fā)者模式F12,你就會(huì)發(fā)現(xiàn)箭頭所指的文件了,沒有看到的話,刷新一下試試。
?

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? # 設(shè)置編碼格式
? ? hreolist = response.json() # 將Response轉(zhuǎn)換成json格式
? ? print(hreolist) # 打印出英雄列表
? ? print(len(hreolist['hero']))? ? # 打印英雄個(gè)數(shù):151
except Exception as e:
? ? print(e)
復(fù)制代碼
通過上面的代碼,我成功的獲取到了所有的英雄,以及英雄的總個(gè)數(shù)。
這里只是截取部分的打印信息
{'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': '無改動(dòng)', 'goldPrice': '4800', 'couponPrice': '2000', 'camp': '', 'campId': '', 'keywords': '安妮,黑暗之女,火女,Annie,anni,heianzhinv,huonv,an,hazn,hn'}
復(fù)制代碼
通過上面的json信息其實(shí)你會(huì)發(fā)現(xiàn),英雄的列表信息是寫在了hero下的。
獲取每一位英雄的ID值
通過剛剛獲取到的json值,你會(huì)發(fā)現(xiàn),這些值里面有一個(gè)鍵:'heroId',那么這個(gè)'heroId'是用來做什么的呢?
這個(gè)我開始是不知道的,接下來我進(jìn)入到了皮膚原畫的網(wǎng)址,馬上就霍然開朗了
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 莉莉婭
復(fù)制代碼
通過上面的三個(gè)URL地址你就會(huì)發(fā)現(xiàn)heroId就是一個(gè)查詢參數(shù)id。
但是在這里有一個(gè)坑,想必你也看到了,英雄的個(gè)數(shù)只有151個(gè),id值卻是876,。沒錯(cuò),在前100多個(gè)英雄都不會(huì)有什么問題很有規(guī)律,但是100多之后就出現(xiàn)問題了,每個(gè)英雄的id值跳轉(zhuǎn)的很多,所以要進(jìn)入每一位英雄的原畫去爬圖片就必須要正確拼接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))? ? # 獲取英雄編號(hào)
復(fù)制代碼
分析原畫網(wǎng)頁(yè)
打開開發(fā)者模式,你會(huì)發(fā)現(xiàn)一個(gè)文件
?

在上圖中可以看到skins有10個(gè)值,點(diǎn)開第一個(gè)可以看到loadingImg,而這個(gè)鍵對(duì)應(yīng)的值就是皮膚原畫的URL地址。
當(dāng)然,作為老玩家們都知道,莉莉婭只有兩種皮膚,但是skins里面為什么有10個(gè)值,依次點(diǎn)開第三個(gè)至第十個(gè),會(huì)發(fā)現(xiàn)其余的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)
復(fù)制代碼
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? # 設(shè)置編碼格式
? ? hreo_info = response.json()
? ? skins = hreo_info['skins']? # 獲取英雄皮膚信息
? ? # 遍歷每一個(gè)皮膚的loadingImg與皮膚名稱
? ? for skin in skins:
? ? ? ? print(skin['loadingImg'])
? ? ? ? print(skin['name'])
except Exception as e:
? ? print(e)
復(fù)制代碼
通過上面的兩組代碼的思路,那么已經(jīng)可以實(shí)現(xiàn)一個(gè)英雄的皮膚原畫的爬取了,需要獲取所有的皮膚原畫,無非就是多一個(gè)循環(huán)。
當(dāng)你會(huì)爬第一個(gè)英雄的原畫時(shí),你還怕得不到其他英雄嗎?
結(jié)語(yǔ)
爬取英雄聯(lián)盟的英雄原畫的思路已經(jīng)分享給大家了。
請(qǐng)問親愛的讀者,你是否可以將王者榮耀的英雄皮膚全部拿下呢?
相信你絕對(duì)是沒有問題的,加油!
最后多說一句,小編是一名python開發(fā)工程師,這里有我自己整理了一套最新的python系統(tǒng)學(xué)習(xí)教程,包括從基礎(chǔ)的python腳本到web開發(fā)、爬蟲、數(shù)據(jù)分析、數(shù)據(jù)可視化、機(jī)器學(xué)習(xí)等。想要這些資料的可以進(jìn)裙930900780領(lǐng)取。
本文章素材來源于網(wǎng)絡(luò),如有侵權(quán)請(qǐng)聯(lián)系刪除。