爬虫-爬取「王者荣耀」全英雄皮肤 |项目复盘

779 阅读4分钟

作者:看那个码农

公众号:看那个码农

1.项目简介

王者荣耀大家都玩过吧,没玩过的也应该听说过,作为当下最火的手机游戏,我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成。

2.项目用途

爬取王者荣耀所有英雄的所有皮肤

3.项目流程

1.准备工作

爬取皮肤本身并不难,难点在于分析,我们首先要得到皮肤图片的url地址,我们先来到王者荣耀的官网:

image.png

点击游戏资料—>英雄资料,随机选取一个英雄,例如“嫦娥”。

image.png

进入英雄皮肤页面,再按F12打开调试台,找到英雄原皮肤的图片地址:

image.png

截取的嫦娥皮肤地址链接为:

http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/515/515-bigskin-2.jpg

接着,我们切换一下英雄的皮肤,会发现图片地址没有明显的变化,只是最后的数字序号改变了,我们根据上面同样操作,继续截取其它的嫦娥皮肤地址链接:

image.png

截取的嫦娥皮肤地址链接为:

#嫦娥如梦令皮肤
http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/515/515-bigskin-3.jpg

#嫦娥露花倒影皮肤
http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/515/515-bigskin-2.jpg

#嫦娥寒月公主皮肤
http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/515/515-bigskin-1.jpg

我们将同一个英雄三个皮肤图片的地址放在一起比较一下,对于同一个英雄的皮肤图片地址,仅仅是最后的数字序号不同,同一个英雄的皮肤图片路径从1开始依次递增。

王者荣耀官网后羿英雄链接

https://pvp.qq.com/web201605/herodetail/169.shtml

王者荣耀官网嫦娥英雄链接

https://pvp.qq.com/web201605/herodetail/515.shtml

紧接着分别点开“后羿”和“嫦娥”的英雄链接,对比网址链接,可以发现英雄的区别是后面网址链接的数字不同。

找到了不同英雄,以及同一英雄的不同皮肤的网址链接规律之后,我们就可以开始用代码实现功能了。

2.代码实现

基于Python3.x

首先我们创建一个Python文件,然后导入osrequests模块。

按照前面的步骤,我们首先需要获取到英雄列表信息,也就是herolist.json文件.

文件地址为: pvp.qq.com/web201605/j…

这在调试台中可以找到。

image.png 我们首先就要通过这个地址获取到英雄列表信息的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个,所以我们就能获取到所有的图片了。我们在桌面新建一个文件夹,命名为wzry,紧接着下面看代码实现:

# 下载图片
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

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()

最后运行程序,我们就可以得到想要收集的全英雄皮肤

image.png

4.项目用途

在深度学习和机器学习的算法模型训练过程中,需要大量下载其它相同类型的图片做为数据集,

我们可以依托该爬虫程序进行爬取,减少人为的劳动量

5.总结思考

该项目可以在此基础上继续完善爬取的过程

同时通过GUI设计进行优化,实现人机交互

方便调用程序的过程

如果你觉得这篇内容对你有帮助的话:

1、点赞支持下吧,让更多的人也能看到这篇内容

2、关注公众号:看那个码农,我们一起学习一起进步。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情