起因:前兩天在公眾號上看到一篇文章內(nèi)容就是爬取王者榮耀的皮膚切端,但是內(nèi)容太大概了鲸拥,如果跟著他做肯定做不出來珍逸,所以我打算自己做。
之前接觸過爬蟲還是幾年前爬取豆瓣電臺的歌曲禽额,那時候用的C++锯厢,json解析還要用第三方庫,總之很麻煩脯倒。最近接觸到了python实辑,深深的感覺這門語言真好。
進(jìn)入正題:如何爬取王者榮耀的英雄皮膚照片藻丢?
分為兩步:
- 找到皮膚圖片的地址
- 下載圖片
1. 尋找皮膚圖片地址
1.1 找到英雄列表
百度“王者榮耀”進(jìn)入官網(wǎng)剪撬,進(jìn)入https://pvp.qq.com/,按F12進(jìn)入調(diào)試界面郁岩,然后按F5刷新界面婿奔,圖中標(biāo)識的herolist.json文件就是我們所需要的英雄列表,其中包括英雄編號问慎、英雄名稱萍摊、英雄類型、皮膚的名稱等信息如叼,在文件上右擊復(fù)制鏈接http://pvp.qq.com/web201605/js/herolist.json
接下來檢驗一下我們的成果:
# 代碼片段1
import urllib.request
import json
import os
response = urllib.request.urlopen("http://pvp.qq.com/web201605/js/herolist.json")
hero_json = json.loads(response.read())
hero_num = len(hero_json)
print(hero_json)
print("hero_num : " , str(hero_num))
以上代碼讀取英雄列表存入hero_json冰木,并獲取英雄數(shù)量,運行效果如圖所示:
1.2 找到英雄皮膚地址
點擊首頁的“游戲資料”標(biāo)簽頁笼恰,進(jìn)入新的界面后點擊一個英雄頭像進(jìn)入英雄資料界面踊沸,此處我們以孫尚香為例:
同樣F12然后F5,將鼠標(biāo)在孫尚香幾個皮膚上依次掃過社证,來看看調(diào)試窗口
可以看到孫尚香的高清皮膚一共6個逼龟,同樣我們在第一個皮膚上右鍵復(fù)制鏈接得到:http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/111/111-bigskin-1.jpg,這就是我們夢寐以求的英雄皮膚鏈接追葡。
分析一下這個鏈接腺律,其中“111”是英雄的編號,最后的“1”是該英雄的皮膚編號宜肉。到此為止匀钧,瀏覽器已經(jīng)沒有用了,該得到的信息我們都有了谬返。
2. 下載圖片
2.1 英雄有幾個皮膚
在第一步獲取到的herolist.json文件中有“skin_name”字段之斯,我們只要解析這個字段就可以獲取皮膚數(shù)量和皮膚名稱。測試代碼(接代碼片段1)如下:
# 代碼片段2
hero_name = hero_json[0]['cname']
skin_names = hero_json[0]['skin_name'].split('|')
skin_num = len(skin_names)
print('hero_name: ', hero_name)
print('skin_names :', skin_names)
print('skin_num: ' + str(skin_num))
運行結(jié)果如下:
可以看到廉頗一共兩個皮膚遣铝,皮膚名稱分別為:正義轟爆和地獄巖魂佑刷。
2.2 下載文件
下載文件用到urlretrieve接口莉擒,測試代碼如下:
for i in range(hero_num):
# 獲取皮膚名稱列表
skin_names = hero_json[i]['skin_name'].split('|')
for cnt in range(len(skin_names)):
save_file_name = 'D:\heroskin\\' + str(hero_json[i]['ename']) + '-' +hero_json[i]['cname']+ '-' +skin_names[cnt] + '.jpg'
skin_url = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/'+str(hero_json[i]['ename'])+ '/' +str(hero_json[i]['ename'])+'-bigskin-' + str(cnt+1) +'.jpg'
urllib.request.urlretrieve(skin_url, save_file_name)
來看下結(jié)果:
至此224個皮膚全部下載完畢,都是高清圖片项乒。
還沒有結(jié)束啰劲,程序有些不完美的地方:
- 如果路徑D:\herolist\不存在,則程序運行失斕春巍;
- 如果中途下載失敗廷支,再次運行程序的時候已經(jīng)下載過的圖片還會再下載一次频鉴。
解決方案:
-
檢查文件是否存在,如果不存在則創(chuàng)建恋拍,代碼如下:
# 文件夾不存在則創(chuàng)建 save_dir = 'D:\heroskin' if not os.path.exists(save_dir): os.mkdir(save_dir)
檢查文件是否存在垛孔,如果存在則跳過下載,代碼如下:
if not os.path.exists(save_file_name):
urllib.request.urlretrieve(skin_url, save_file_name)
至此施敢,大功告成周荐,貼一下完整代碼:
# -*- coding: utf-8 -*-
"""
Created on Wed Aug 23 23:12:17 2017
@author: WangQiang
"""
import urllib.request
import json
import os
response = urllib.request.urlopen("http://pvp.qq.com/web201605/js/herolist.json")
hero_json = json.loads(response.read())
hero_num = len(hero_json)
# 文件夾不存在則創(chuàng)建
save_dir = 'D:\heroskin\\'
if not os.path.exists(save_dir):
os.mkdir(save_dir)
for i in range(hero_num):
# 獲取英雄皮膚列表
skin_names = hero_json[i]['skin_name'].split('|')
for cnt in range(len(skin_names)):
save_file_name = save_dir + str(hero_json[i]['ename']) + '-' +hero_json[i]['cname']+ '-' +skin_names[cnt] + '.jpg'
skin_url = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/'+str(hero_json[i]['ename'])+ '/' +str(hero_json[i]['ename'])+'-bigskin-' + str(cnt+1) +'.jpg'
if not os.path.exists(save_file_name):
urllib.request.urlretrieve(skin_url, save_file_name)
除去注釋和空行,一共16行代碼實現(xiàn)了下載王者榮耀所有皮膚的功能僵娃,這些皮膚用來當(dāng)作桌面背景也是極好的8抛鳌!默怨!體驗一下: