王者榮耀你們都玩過吧,沒玩過的也應該據說過,做爲時下最火的手機MOBA遊戲,咳咳,好像跑題了。咱們今天的重點是爬取王者榮耀全部英雄的全部皮膚,並且僅僅使用20行Python代碼便可完成。 文中源代碼在文章末尾,可自行復制粘貼。html
爬取皮膚自己並不難,難點在於分析,咱們首先得獲得皮膚圖片的url地址,話很少說,咱們立刻來到王者榮耀的官網: python
咱們點擊英雄資料,而後隨意地選擇一位英雄,接着F12打開調試臺,找到英雄原皮膚的圖片地址: web
接着,咱們切換一下英雄的皮膚,會發現圖片地址沒有明顯的變化,只是最後的數字序號改變了,咱們將兩個皮膚圖片的地址放在一塊兒比較一下:json
http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/523/523-bigskin-1.jpg http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/523/523-bigskin-2.jpg
咱們能夠猜想,對於同一個英雄的皮膚圖片地址,僅僅是最後的數字序號不一樣,爲了證明咱們的猜測,咱們能夠繼續找出一個英雄的全皮膚圖片,找一個皮膚多一點的,例如我這裏找的是孫尚香,將它的全部皮膚圖片地址放在一塊兒比較:瀏覽器
http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/111/111-bigskin-1.jpg http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/111/111-bigskin-2.jpg http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/111/111-bigskin-3.jpg http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/111/111-bigskin-4.jpg http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/111/111-bigskin-5.jpg http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/111/111-bigskin-6.jpg http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/111/111-bigskin-7.jpg
由此咱們得出結論,同一個英雄的皮膚圖片路徑從1開始依次遞增,咱們再來看看不一樣英雄之間是如何區分的。會發現,無論皮膚圖片如何改變,瀏覽器上方的地址始終是不變的,因此咱們將兩個不一樣英雄的url地址放到一塊兒比較一下:網絡
https://pvp.qq.com/web201605/herodetail/523.shtml https://pvp.qq.com/web201605/herodetail/111.shtml
乍一看,彷佛沒有什麼規律,但咱們要從這裏發現一點,就是最後的數字其實控制的是哪一個英雄,咱們暫且認爲它是英雄的編號,可不幸的是,英雄編號之間好像沒有什麼規律,不用着急,咱們再到官網上找找線索。函數
在英雄資料界面,咱們打開F12調試臺,經過抓取網絡請求,我發現了幾個文件: 學習
點擊網絡,而後點擊XHR
,就能夠看到這幾個文件,看到文件的名字你們應該就清楚了,這些文件存儲的就是英雄列表信息,咱們點擊查看一下: 在這裏插入圖片描述 沒錯,這裏存儲的就是英雄信息,包括英雄的名字,英雄編號等等其它信息,咱們能夠試試這些信息的準確性,例如小喬的ename,也就是英雄編號爲106,因此按照以前的想法,英雄小喬的詳情地址應爲:https://pvp.qq.com/web201605/herodetail/106.shtml 通過嘗試後發現確實如此。測試
到這裏,準備工做就完成了,其實進行到這裏,整個工程就完成了一半了,接下來就是代碼的實現了。jsonp
首先咱們建立一個Python
文件,而後導入os
和requests
模塊。 按照前面的步驟,咱們首先須要獲取到英雄列表信息,也就是herolist.json
文件,文件地址爲:https://pvp.qq.com/web201605/js/herolist.json,這在調試臺中能夠找到。 那麼咱們首先就要經過這個地址獲取到英雄列表信息的json數據,而後解析json數據,將有用的信息提取出來:
url = 'https://pvp.qq.com/web201605/js/herolist.json' herolist = requests.get(url) # 獲取英雄列表json文件 herolist_json = herolist.json() # 轉化爲json格式 hero_name = list(map(lambda x: x['cname'], herolist.json())) # 提取英雄的名字 hero_number = list(map(lambda x: x['ename'], herolist.json())) # 提取英雄的編號
這樣咱們就獲取到了英雄名字和編號,能夠輸出測試一下: 拿到了英雄編號以後,事情就變得很簡單了,只需拼接一下url地址便可: http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/' + hero_number + '/' + hero_number + '-bigskin-1.jpg
,這樣能夠獲取到全部英雄的皮膚圖片了,可是這裏會有一個問題,英雄的皮膚是有多有少的,有的英雄只有兩個皮膚,有的卻有六七個,因此圖片編號的最大值咱們並不清楚,這裏我採用了一個比較笨的辦法,就是讓一個變量從1到10依次遞增去拼接圖片地址,若是遇到沒有的圖片咱們就不處理,由於沒有一個英雄的皮膚超過了10個,因此咱們就能獲取到全部的圖片了。下面看代碼實現:
# 下載圖片 def downloadPic(): i = 0 for j in hero_number: # 建立文件夾 os.mkdir("C:\\Users\\Administrator\\Desktop\\wzry\\" + hero_name[i]) # 進入建立好的文件夾 os.chdir("C:\\Users\\Administrator\\Desktop\\wzry\\" + hero_name[i]) i += 1 for k in range(10): # 拼接url onehero_link = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/' + str(j) + '/' + str( j) + '-bigskin-' + str(k) + '.jpg' im = requests.get(onehero_link) # 請求url if im.status_code == 200: open(str(k) + '.jpg', 'wb').write(im.content) # 寫入文件
實現很是地簡單,代碼註釋也已經寫得很清楚了,有了這個函數以後,咱們只需調用一下,就能夠下載圖片了,整個程序的完整代碼以下:
import os import requests # python0基礎小白加羣:456926667,獲取更多的python練手項目、練習,以及學習交流。 url = 'https://pvp.qq.com/web201605/js/herolist.json' herolist = requests.get(url) # 獲取英雄列表json文件 herolist_json = herolist.json() # 轉化爲json格式 hero_name = list(map(lambda x: x['cname'], herolist.json())) # 提取英雄的名字 hero_number = list(map(lambda x: x['ename'], herolist.json())) # 提取英雄的編號 # 下載圖片 def downloadPic(): i = 0 for j in hero_number: # 建立文件夾 os.mkdir("C:\\Users\\Administrator\\Desktop\\wzry\\" + hero_name[i]) # 進入建立好的文件夾 os.chdir("C:\\Users\\Administrator\\Desktop\\wzry\\" + hero_name[i]) i += 1 for k in range(10): # 拼接url onehero_link = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/' + str(j) + '/' + str( j) + '-bigskin-' + str(k) + '.jpg' im = requests.get(onehero_link) # 請求url if im.status_code == 200: open(str(k) + '.jpg', 'wb').write(im.content) # 寫入文件 downloadPic()
除去註釋,接近20行的代碼咱們就完成了王者榮耀全英雄皮膚的爬取,是否是很是簡單呢?咱們能夠測試一下這個程序,首先要在桌面上建立一個文件夾,名爲wzry,由於這裏的代碼我已經寫死了,若是要修改的話你們也能夠進行修改,文件夾建立完成後點擊運行便可,等待片刻,圖片就所有下載完成了。
對於程序中json字符串的解析,咱們還可使用jsonpath模塊來進行,使用該模塊可以更加快捷地獲取到咱們想要的信息,解析方式以下:
hero_name = jsonpath.jsonpath(html_json, "$..cname") hero_number = jsonpath.jsonpath(html_json, "$..ename")
該方法接收一個json字符串和解析規則,$…cname則表示從根目錄下找尋任意位置的以cname爲鍵的值,並放入字典中。 結尾
爬蟲是很是有趣的,由於它很是直觀,視覺衝擊感強,寫出來也頗有成就感,爬蟲雖然強大,但千萬不能隨意爬取隱私信息。
最後,若是對文中程序有更好的建議,歡迎評論區留言。