Python爬取王者荣耀英雄皮肤壁纸

Python爬取王者荣耀英雄皮肤壁纸

二月 23, 2020

运用Python爬取王者荣耀官网的壁纸

最近疫情席卷了整个中国,无奈作为普通人能做的只有呆在家里给祖国做贡献,闲来无事在家里打王者荣耀,单排表示上坟真的很难,皮肤真好看但我不舍得花钱,索性去官网爬一套皮肤壁纸下来自己用吧,一个简单的爬虫小程序,下面开始👇

官网英雄池抓包分析

首先我们进入官网,点击英雄资料,进入到荣耀里所有英雄资料池,在英雄池页面的右键点击检查,会弹出浏览器的一些设置选项(这里我选用的是Chrome浏览器)如下图所示

在network设置中可以看到整个网页加载的瀑布流(记得Comand/Ctrl+R一下),在下方找到herplist.json,进行点击,可以在右侧看见数据请求的相关信息,这里的Request URL则是我们要请求的URL地址,之后再往下滑动找到另一个所需要的参数headers

这个时候网页请求的url和headers信息都获取到了,接下来我们就可以开始写代码了,这里博主使用的pycharm,需要引用到的库是requests库,下面是代码片段

1
2
3
4
5
6
7
8
import requests

base_url = 'https://pvp.qq.com/web201605/js/herolist.json'
headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}

resp = requests.get(base_url,headers=headers)
data_str = resp.text
print(data_str)

我们将获取到的数据进行text转换后打印出来,结果如下图

接下来需要将获取到的从json类型转换为python的数据类型才可以进行处理,这里需要import json

1
2
data_list = json.loads(data_str)
print(data_list)

我们再打印一下看一下数据

这里我们用for循环进行一下整理,方便后面的数据处理

1
2
for data in data_list:
print(data)

打印出来的结果如下图

数据已经变的有序很多了。

好了,英雄列表的数据我们已经可以获得了,接下来随便点击一个英雄进去,这里我选的是明世隐,进去之后可以看到右下角可以切换皮肤,我们右键点击那里,选择检查,如下图

下图红框选中的地址,复制之后,在浏览器中输入就可以看到下面的皮肤壁纸了

这里我们观察图片地址,其中“501”和之前请求的data中的“ename”所对应,英雄的名字则与“cname”所对应,而皮肤所对应的字段是“skin_name”,并且每个皮肤名字间用“|”来分隔,这里我们可以通过split将我们所要的需要的skin_name分离出来,下面是代码片段

1
2
3
4
5
6
7
8
9
for data in data_list:
# print(data)
ename = data['ename'] #英雄编号
cname = data['cname'] #英雄名称
try:
skin_name = data['skin_name'].split('|') #英雄皮肤数量,切割皮肤名字,计算出多少个皮肤
print(ename, cname, skin_name)
except Exception as e:
print(e)

这里写了一个异常捕获是因为在处理曜这个英雄的皮肤数据时会有异常。这里我们打印出来的结果如下图

接下来我们对每个皮肤进行获取处理,这里每个英雄的皮肤个数是不一样的,所以这里还需要使用for循环去遍历每个英雄的每个皮肤,代码段如下

1
2
3
for skin_num in range(1,len(skin_name)+1):
skin_url = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/'+str(ename)+'/'+str(ename)+'-bigskin-'+str(skin_num)+'.jpg'
print(skin_url)

执行结果如下

这里可以看我们已经获取到每个英雄每个皮肤的图片源了,接下来只需要只需将图片源爬取下来即可,代码如下

1
2
3
4
5
6
7
# 发送图片的数据请求
skin_data = requests.get(skin_url,headers=headers).content

#保存数据到文件夹
with open('img/' + cname +'-'+skin_name[skin_num-1] + '.jpg','wb') as f:
print('正在下载图片:',cname +'-'+skin_name[skin_num-1])
f.write(skin_data)

在项目文件下新建一个文件夹img,预计将图片保存在这个文件夹内,这里我们import time做一个时间的记录,接下来我们运行进行图片的爬取

可以看到爬取所有的图片花费了76秒左右,我们再看文件夹里已经有爬取下来的图片壁纸了

好了这就是整个爬虫过程了,下面放完整的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import requests
import json
import time

start_time = time.time() #开始时间
base_url = 'https://pvp.qq.com/web201605/js/herolist.json'
headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}

resp = requests.get(base_url,headers=headers)
data_str = resp.text
# print(data_str)


data_list = json.loads(data_str)
# print(data_list)

for data in data_list:
# print(data)
ename = data['ename'] #英雄编号
cname = data['cname'] #英雄名称
try:
skin_name = data['skin_name'].split('|') #英雄皮肤数量,切割皮肤名字,计算出多少个皮肤
# print(ename, cname, skin_name)
except Exception as e:
print(e)
for skin_num in range(1,len(skin_name)+1):
skin_url = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/'+str(ename)+'/'+str(ename)+'-bigskin-'+str(skin_num)+'.jpg'
# print(skin_url)
# 发送图片的数据请求
skin_data = requests.get(skin_url,headers=headers).content

#保存数据到文件夹
with open('img/' + cname +'-'+skin_name[skin_num-1] + '.jpg','wb') as f:
print('正在下载图片:',cname +'-'+skin_name[skin_num-1])
f.write(skin_data)

end_time = time.time() #结束时间
all_time = end_time - start_time
print('共花费时间:',all_time,'秒')

好了,买不起也可以爬下来当壁纸,enjoy it~