爬取英雄联盟英雄图片建立数据集
本教程来自DUT515斑鸠实验室
小白在练习的时候,在教程里都会有各种现成的经典的数据集作为例子当你,比如鸢尾花啊:
手写数字啊:
而当你学会了这些内容,想要跃跃欲试的时候,你想要爬取一些图片作为自己的数据集的时候又苦于自己没学过爬虫吧!反正我有过这种困惑,在这里通过十来行不是很精美的代码,便可以帮你批量下载英雄联盟的英雄图片,建立属于你的数据集。
1.打开你想爬取的图片页面
在资料库里可以爬取各个英雄的每个皮肤,但这里我们教程爬取各英雄高清原画所以这里我们选择英雄联盟宇宙的英雄界面:
英雄联盟宇宙网页地址
打开页面发现里面有各种我们需要的英雄高清原画,废话不多说直接开爬!
2.确定数据来源
我们打开网页的时候会发现这些资源并不是第一时间出现的,而是经过加载之后才展示给我们的,所以我们要确定这些加载的信息的数据来源。
以Google Chrome浏览器为例,按F12进入开发者工具:
点击Network下的XHR,只保留这个数据信息,然后重新加载网页,看看会给我们返回什么数据:
我们可以从上图看出,随时间推移,我们在左侧加载了若干json数据集,在右侧Preview界面可以看到该数据集的相关数据:
其中我们点击index.json,展开其中内容可以发现,这就是我们要找的数据:
好了,这就是我们想要的东西,右键index.json,点击copy——copy link address,就可以得到该数据集的地址啦!
返回值:https://yz./v1/zh_cn/search/index.json
3.爬取图片
接下来编写代码爬取图片首先import一下我们要使用到的包:
import requests #爬图搞信息都靠它import pprint #这个可以把你的json包信息格式较为清楚的展示
定义我们要爬取的json数据集地址:
json_url = "https://yz./v1/zh_cn/search/index.json"
返回网址中的json信息:
response = requests.get(json_url)#get一下网址里的内容data = response.json()#将内容通过json格式保存
print一下,看看我们得到了什么:
print(data)
返回了我们想要的信息,但是格式十分不好看,它也太长了(长了还不喜欢?)
通过pprint可以调整格式,看下结果:
pprint.pprint(data)
很清晰是不是!英雄的名称,图片的下载地址都可以看到!
从中我们可以发现这个json数据集就是一个字典呀,列表啊,字典啊的嵌套,只要我们搞清楚一层一层的关系就能锁定我们想要的信息:
比如英雄的名字我们可以定位为:
data['champions'][0]['name']
英雄的图片链接我们可以定位为:
datadata['champions'][0]["image"]["uri"]
通过这两个定位,各位可以尝试能否返回你想要的东西哦!
接下来我们就写个小循环搞一下图片,并把图片的名称叫做英雄的名字:
hero = [] #定义一个空列表用来存放循环信息hero_name = []#定义空列表存放英雄名字for i in range(148):#148个英雄,循环148次hero = data['champions'][i]#取第i次的英雄作为当前英雄hero_name.append(hero['name'])#取该英雄的名字加到名字列表print(test["image"]["uri"])#打印一下我们的下载地址img_data = requests.get(hero["image"]["uri"]).content#使用该命令找到英雄图片信息并下载内容#将下载内容写入文件,文件名为英雄名hero_names[i].jpgwith open(hero_name[i] + '.jpg', mode = "wb") as f:f.write(img_data)
好了,运行一下,等程序执行结束,看看你的代码文件夹里有没有多出148张1920X1133的帅气英雄联盟原画吧!
最后附上完整代码:
import requestsimport pprintjson_url = "https://yz./v1/zh_cn/search/index.json"response = requests.get(json_url)data = response.json()#html = response.textpprint.pprint(data)print(data)# print(data['champions'])hero = []# test = data['champions'][0]# print(test)hero_name = []# hero = test['name']# print(hero)for i in range(148):hero = data['champions'][i]hero_name.append(hero['name'])print(hero["image"]["uri"])img_data = requests.get(hero["image"]["uri"]).contentwith open(hero_name[i] + '.jpg', mode="wb") as f:f.write(img_data)
好了,下次我们一起搞一个卷积网络,下次再见!