溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

30行python代碼實現(xiàn)爬取英雄聯(lián)盟全英雄皮膚的方法

發(fā)布時間:2020-11-30 11:00:17 來源:億速云 閱讀:222 作者:小新 欄目:編程語言

小編給大家分享一下30行python代碼實現(xiàn)爬取英雄聯(lián)盟全英雄皮膚的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

requests模塊介紹

首先是requests模塊,這是一個模擬瀏覽器請求的模塊,我們可以通過它來獲取網(wǎng)頁上的信息,比如百度:

import requests

url = 'http://www.baidu.com'response = requests.get(url)print(response.text)

運行結(jié)果:
30行python代碼實現(xiàn)爬取英雄聯(lián)盟全英雄皮膚的方法
通過get函數(shù)就能夠向指定參數(shù)的url發(fā)送請求,得到的response對象中封裝了很多響應(yīng)的信息,其中的text即為響應(yīng)內(nèi)容,注意到獲取的內(nèi)容里有亂碼,這是編解碼不一致造成的,只需先獲取二進制數(shù)據(jù),然后重新解碼即可:

import requests

url = 'http://www.baidu.com'response = requests.get(url)print(response.content.decode())

運行結(jié)果:
30行python代碼實現(xiàn)爬取英雄聯(lián)盟全英雄皮膚的方法

json模塊

json模塊可以對json字符串和Python數(shù)據(jù)類型進行相互轉(zhuǎn)換,比如將json轉(zhuǎn)換為Python對象:

import json

json_str = '{"name":"zhangsan","age":"20"}'rs = json.loads(json_str)print(type(rs))print(rs)

使用loads函數(shù)即可將json字符串轉(zhuǎn)為字典類型,運行結(jié)果:

<class 'dict'>
{'name': 'zhangsan', 'age': '20'}

而若是想將Python數(shù)據(jù)轉(zhuǎn)為json字符串,也非常簡單:

import json

str_dict = {'name': 'zhangsan', 'age': '20'}json_str = json.dumps(str_dict)print(type(json_str))print(json_str)

通過dumps函數(shù)即可將Python數(shù)據(jù)轉(zhuǎn)為json字符串,運行結(jié)果:

<class 'str'>
{"name": "zhangsan", "age": "20"}

準(zhǔn)備工作

前面介紹了兩個模塊,通過這兩個模塊我們就能夠完成這個程序了。
在正式開始編寫代碼之前,我們首先需要分析數(shù)據(jù)來源,來到官網(wǎng):https://lol.qq.com/main.shtml,往下拉找到英雄列表:
30行python代碼實現(xiàn)爬取英雄聯(lián)盟全英雄皮膚的方法
我們隨意點擊一個英雄進去查看:
30行python代碼實現(xiàn)爬取英雄聯(lián)盟全英雄皮膚的方法
在皮膚圖片上右鍵點擊檢查:30行python代碼實現(xiàn)爬取英雄聯(lián)盟全英雄皮膚的方法
這樣就找到了這個皮膚的url,我們再選擇第二個皮膚,看看它的url:
30行python代碼實現(xiàn)爬取英雄聯(lián)盟全英雄皮膚的方法
我們將安妮所有皮膚的url全部拿出來看看:

https://game.gtimg.cn/images/lol/act/img/skin/big1000.jpg
https://game.gtimg.cn/images/lol/act/img/skin/big1001.jpg
https://game.gtimg.cn/images/lol/act/img/skin/big1002.jpg
https://game.gtimg.cn/images/lol/act/img/skin/big1003.jpg
https://game.gtimg.cn/images/lol/act/img/skin/big1004.jpg
https://game.gtimg.cn/images/lol/act/img/skin/big1005.jpg
https://game.gtimg.cn/images/lol/act/img/skin/big1006.jpg
https://game.gtimg.cn/images/lol/act/img/skin/big1007.jpg
https://game.gtimg.cn/images/lol/act/img/skin/big1008.jpg
https://game.gtimg.cn/images/lol/act/img/skin/big1009.jpg
https://game.gtimg.cn/images/lol/act/img/skin/big1010.jpg
https://game.gtimg.cn/images/lol/act/img/skin/big1011.jpg
https://game.gtimg.cn/images/lol/act/img/skin/big1012.jpg

從這些url中能發(fā)現(xiàn)什么規(guī)律呢?其實規(guī)律非常明顯,url前面的內(nèi)容都是一樣的,唯一不同的是big1000.jpg,而每個皮膚圖片就是在該url的基礎(chǔ)上加1。

那么問題來了,它是如何區(qū)分這張圖片所屬的英雄的呢?我們觀察瀏覽器上方的地址:
30行python代碼實現(xiàn)爬取英雄聯(lián)盟全英雄皮膚的方法
地址上有一個屬性值id為1,那么我們可以猜測一下,皮膚圖片url中的big1000.jpg是不是由英雄id和皮膚id共同組成的呢?

要想證明我們的猜想,就必須再去看看其它英雄皮膚是不是也滿足這一條件:
30行python代碼實現(xiàn)爬取英雄聯(lián)盟全英雄皮膚的方法
打開燼的詳情頁面,其id為202,由此,燼的皮膚圖片url最后部分應(yīng)為:big ' + 202 + ' 皮膚編號.jpg,所以其url應(yīng)為:

https://game.gtimg.cn/images/lol/act/img/skin/big202000.jpg
https://game.gtimg.cn/images/lol/act/img/skin/big202001.jpg
https://game.gtimg.cn/images/lol/act/img/skin/big202002.jpg
https://game.gtimg.cn/images/lol/act/img/skin/big202003.jpg
https://game.gtimg.cn/images/lol/act/img/skin/big202004.jpg
https://game.gtimg.cn/images/lol/act/img/skin/big202005.jpg

事實是不是如此呢?檢查一下便知:
30行python代碼實現(xiàn)爬取英雄聯(lián)盟全英雄皮膚的方法
規(guī)律已經(jīng)找到,但是我們還面臨著諸多問題,比如每個英雄對應(yīng)的id是多少呢?每個英雄又分別有多少個皮膚呢?

查詢英雄id

先來解決第一個問題,每個英雄對應(yīng)的id是多少?我們只能從官網(wǎng)首頁中找找線索,在首頁位置打開網(wǎng)絡(luò)調(diào)試臺:
30行python代碼實現(xiàn)爬取英雄聯(lián)盟全英雄皮膚的方法
點擊Network,并選中XHR,XHR是瀏覽器與服務(wù)器請求數(shù)據(jù)所依賴的對象,所以通過它便能篩選出一些服務(wù)器的響應(yīng)數(shù)據(jù)。
此時我們刷新頁面,在篩選出的內(nèi)容發(fā)現(xiàn)了這么一個東西:
30行python代碼實現(xiàn)爬取英雄聯(lián)盟全英雄皮膚的方法
hero_list,英雄列表?這里面會不會存儲著所有英雄的信息呢?
30行python代碼實現(xiàn)爬取英雄聯(lián)盟全英雄皮膚的方法
點擊右側(cè)的Response,得到了一串json字符串,我們將其解析一下:
30行python代碼實現(xiàn)爬取英雄聯(lián)盟全英雄皮膚的方法
這些數(shù)據(jù)里果然存儲的是英雄的信息,包括名字、id、介紹等等,那么接下來我們的任務(wù)就是將英雄名字和id單獨提取出來,過濾掉其它信息。

忘了告訴你們了,這個文件的url在這里可以找到:
30行python代碼實現(xiàn)爬取英雄聯(lián)盟全英雄皮膚的方法
接下來開始寫代碼:

import jsonimport requests# 定義一個列表,用于存放英雄名稱和對應(yīng)的idhero_id = []url = 'https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js?v=20'response = requests.get(url)text = response.text# 將json字符串轉(zhuǎn)為列表hero_list = json.loads(text)['hero']# 遍歷列表for hero in hero_list:
    # 定義一個字典
    hero_dict = {'name': hero['name'], 'id': hero['heroId']}
    # 將列表加入字典
    hero_id.append(hero_dict)print(hero_id)

首先通過requests模塊請求該url,就能夠獲取到一個json字符串,然后使用json模塊將該字符串轉(zhuǎn)為Python中的列表,最后循環(huán)取出每個英雄的name和heroid屬性,放入新定義的列表中,這個程序就完成了英雄id的提取。

查詢皮膚個數(shù)

接下來解決第二個問題,如何知曉某個英雄究竟有多少個皮膚,按照剛才的思路,我們可以猜測一下,對于皮膚也應(yīng)該會有一個文件存儲著皮膚信息,在某個英雄的皮膚頁面打開網(wǎng)絡(luò)調(diào)試臺,并選中XHR,刷新頁面,找找線索:
30行python代碼實現(xiàn)爬取英雄聯(lián)盟全英雄皮膚的方法
找來找去確實找不到有哪個文件是跟皮膚有關(guān)系的,但是這里發(fā)現(xiàn)了一個31.js文件,而當(dāng)前英雄的id也為31,這真的是巧合嗎?我們將右邊的json字符串解析一下:
30行python代碼實現(xiàn)爬取英雄聯(lián)盟全英雄皮膚的方法
該json數(shù)據(jù)中有一個skins屬性,該屬性值即為當(dāng)前英雄的皮膚信息,既然找到了數(shù)據(jù),那接下來就好辦了,開始寫代碼:

import jsonimport requests

url = 'https://game.gtimg.cn/images/lol/act/img/js/hero/31.js'response = requests.get(url)text = response.text# 將json字符串轉(zhuǎn)為列表skins_list = json.loads(text)['skins']skin_num = len(skins_list)

源程序?qū)崿F(xiàn)

準(zhǔn)備工作已經(jīng)完成了我們所有的前置任務(wù),接下來就是在此基礎(chǔ)上編寫代碼了:

import requestsimport jsonimport osimport tracebackfrom tqdm import tqdmdef spider_lol():
    # 定義一個列表,用于存放英雄名稱和對應(yīng)的id
    hero_id = []
    skins = []
    url = 'https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js?v=20'
    response = requests.get(url)
    text = response.text    # 將json字符串轉(zhuǎn)為列表
    hero_list = json.loads(text)['hero']
    # 遍歷列表
    for hero in hero_list:
        # 定義一個字典
        hero_dict = {'name': hero['name'], 'id': hero['heroId']}
        # 將列表加入字典
        hero_id.append(hero_dict)
    # 得到每個英雄對應(yīng)的id后,即可獲得英雄對應(yīng)皮膚的url
    # 英雄id + 001
    # 遍歷列表
    for hero in hero_id:
        # 得到英雄名字
        hero_name = hero['name']
        # 得到英雄id
        hero_id = hero['id']
        # 創(chuàng)建文件夾
        os.mkdir('C:/Users/Administrator/Desktop/lol/' + hero_name)
        # 進入文件夾
        os.chdir('C:/Users/Administrator/Desktop/lol/' + hero_name)
        # 得到id后即可拼接存儲該英雄信息的url
        hero_info_url = 'https://game.gtimg.cn/images/lol/act/img/js/hero/' + hero_id + '.js'
        # 通過訪問該url獲取英雄的皮膚數(shù)量
        text = requests.get(hero_info_url).text
        info_list = json.loads(text)
        # 得到皮膚名稱
        skin_info_list = info_list['skins']
        skins.clear()
        for skin in skin_info_list:
            skins.append(skin['name'])
        # 獲得皮膚數(shù)量
        skins_num = len(skin_info_list)
        # 獲得皮膚數(shù)量后,即可拼接皮膚的url,如:安妮的皮膚url為:
        # https://game.gtimg.cn/images/lol/act/img/skin/big1000.jpg ~ https://game.gtimg.cn/images/lol/act/img/skin/big1012
        s = ''
        for i in tqdm(range(skins_num), '正在爬取' + 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'
                # 訪問當(dāng)前皮膚url
                im = requests.get(skin_url)
            except:
                # 某些英雄的炫彩皮膚沒有url,所以直接終止當(dāng)前url的爬取,進入下一個
                continue
            # 保存圖片
            if im.status_code == 200:
                # 判斷圖片名稱中是否帶有'/'、'\'
                if '/' in skins[i] or '\\' in skins[i]:
                    skins[i] = skins[i].replace('/', '')
                    skins[i] = skins[i].replace('\\', '')
                with open(skins[i] + '.jpg', 'wb') as f:
                    f.write(im.content)def main():
    try:
        spider_lol()
    except Exception as  e:
        # 打印異常信息
        print(e)if __name__ == '__main__':
    main()

運行效果:
30行python代碼實現(xiàn)爬取英雄聯(lián)盟全英雄皮膚的方法
運行之前記得在桌面上創(chuàng)建一個lol文件夾,如果想改動的話也可以修改程序:
30行python代碼實現(xiàn)爬取英雄聯(lián)盟全英雄皮膚的方法
程序中還考慮到了一些其它情況,比如在爬取這個皮膚的時候會出現(xiàn)問題:
30行python代碼實現(xiàn)爬取英雄聯(lián)盟全英雄皮膚的方法
因為圖片路徑是以皮膚名字命名的,然而這個皮膚的名字中竟然有個/,它是會影響到我們的圖片保存操作的,所以在保存前將斜杠替換成空字符即可。

還有一個問題就是即使是第一個皮膚,其編號也應(yīng)該為000而不是0,所以還需要對其進行一個轉(zhuǎn)化,讓其始終是三位數(shù)。

以上是“30行python代碼實現(xiàn)爬取英雄聯(lián)盟全英雄皮膚的方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI