久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      厲害了,30行python代碼爬取英雄聯(lián)盟全英雄皮膚

      python視頻教程欄目精煉介紹如何爬取全英雄皮膚。

      厲害了,30行python代碼爬取英雄聯(lián)盟全英雄皮膚

      免費(fèi)推薦:python視頻教程

      距離上次寫爬蟲文章已經(jīng)過了許久了,之前寫過一篇20行Python代碼爬取王者榮耀全英雄皮膚
      ,反響強(qiáng)烈,其中有很多同學(xué)希望我再寫一篇針對(duì)英雄聯(lián)盟官網(wǎng)的皮膚爬取,但苦于事情繁多,便一拖再拖,一直拖到了現(xiàn)在,那么本篇文章我們就一起來(lái)學(xué)習(xí)一下如何爬取英雄聯(lián)盟全英雄皮膚。

      爬取代碼非常簡(jiǎn)單,從上到下可能只需要寫30行左右就能完成,但重要的是分析過程,在此之前,我們先來(lái)了解一下本篇文章需要用到的模塊。

      requests模塊介紹

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

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

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

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

      運(yùn)行結(jié)果:
      厲害了,30行python代碼爬取英雄聯(lián)盟全英雄皮膚

      json模塊

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

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

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

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

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

      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字符串,運(yùn)行結(jié)果:

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

      準(zhǔn)備工作

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

      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ī)律呢?其實(shí)規(guī)律非常明顯,url前面的內(nèi)容都是一樣的,唯一不同的是big1000.jpg,而每個(gè)皮膚圖片就是在該url的基礎(chǔ)上加1。

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

      要想證明我們的猜想,就必須再去看看其它英雄皮膚是不是也滿足這一條件:
      厲害了,30行python代碼爬取英雄聯(lián)盟全英雄皮膚
      打開燼的詳情頁(yè)面,其id為202,由此,燼的皮膚圖片url最后部分應(yīng)為:big ' + 202 + ' 皮膚編號(hào).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

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

      查詢英雄id

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

      忘了告訴你們了,這個(gè)文件的url在這里可以找到:
      厲害了,30行python代碼爬取英雄聯(lián)盟全英雄皮膚
      接下來(lái)開始寫代碼:

      import jsonimport requests# 定義一個(gè)列表,用于存放英雄名稱和對(duì)應(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:     # 定義一個(gè)字典     hero_dict = {'name': hero['name'], 'id': hero['heroId']}     # 將列表加入字典     hero_id.append(hero_dict)print(hero_id)

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

      查詢皮膚個(gè)數(shù)

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

      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ù),接下來(lái)就是在此基礎(chǔ)上編寫代碼了:

      import requestsimport jsonimport osimport tracebackfrom tqdm import tqdmdef spider_lol():     # 定義一個(gè)列表,用于存放英雄名稱和對(duì)應(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:         # 定義一個(gè)字典         hero_dict = {'name': hero['name'], 'id': hero['heroId']}         # 將列表加入字典         hero_id.append(hero_dict)     # 得到每個(gè)英雄對(duì)應(yīng)的id后,即可獲得英雄對(duì)應(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)         # 進(jìn)入文件夾         os.chdir('C:/Users/Administrator/Desktop/lol/' + hero_name)         # 得到id后即可拼接存儲(chǔ)該英雄信息的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的爬取,進(jìn)入下一個(gè)                 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()

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

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

      最后

      本篇文章同樣繼承了上篇文章精簡(jiǎn)的特點(diǎn),拋去注釋的話總共30行代碼左右,程序當(dāng)然還有一些其它地方可以進(jìn)一步優(yōu)化,這就交給大家自由發(fā)揮了。

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)