先来看一张图片。
先讲解下思路,然后直接放源码,想要获取源码的同学直接拉到最下面就好。
1.爬虫第一步
首先要分析网页的DOM结构,就是英雄联盟官网,然后在下面找到英雄资料。然后在这里发现一个神奇的文件hero_list.js
,打开看一下,结构是这样的。
image.png
嗯~~~,感觉可以省了好多工作了。可以到bejson转中文,然后解析看一下,妥妥的json文件。
其实在这个文件里,我们需要的就一个heroId,因为在英雄详情页,有 1.js
, 2.js
,天真的我以为全部是按顺序排的,所以直接写了个循环去获取,后来发现不是,走过的坑就不带大家走一遍了,直接说结论,有 heroId
,接下来就好办了,在英雄详情页可以找到这个文 https://game.gtimg.cn/images/lol/act/img/js/hero/1.js,这个文件也是一个标准的json文件,里面包含英雄的基本信息,还有皮肤信息。图片路径也在这里面。好了到目前为止准备工作是做好了。
2.爬虫第二步
准备工作做好了,接下来当然是开始写代码了。思路也很简单,首先读取hero_list.js
,获取所有的heroId
,然后拼装为这样的文件路径
url="https://game.gtimg.cn/images/lol/act/img/js/hero/"+str(c["heroId"])+".js"
接下来就是挨个去读取文件找到图片地址,下载图片就好了。这里面我稍稍做了点修改,包括创建文件夹的时候,是将英雄名称作为文件夹名,皮肤名字作为图片名字,因为不做修改的话,下下来的图片全部都是big1005.jpg,big1006.jpg
,皮肤作为文件名字的话有些特殊的字符串需要去掉,文件名是不允许/
出现的,英雄皮肤名字中有个K/D/A
,具体是谁忘了,所以拿皮肤名字作为文件名的话,有些特殊字符需要去掉。好了,接下来放出完整代码。代码中写了很多注释,可以参考下。
#coding:utf8
import requests
import json
import os
import urllib.request
cur_path = os.path.abspath(os.curdir)
champion = "https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js"
championobj = json.loads(requests.get(champion).text)
heroIds = championobj['hero']
# print(championobj)
# # print(jsonobj)
for c in heroIds:
print(c["heroId"])
url="https://game.gtimg.cn/images/lol/act/img/js/hero/"+str(c["heroId"])+".js"
# 发送请求,获取响应结果
response = requests.get(url)
text = response.text
# 打印本次请求响应内容
# print(text)
# 将响应内容转换为Json对象
jsonobj = json.loads(text)
# print(jsonobj)
#获取英雄名称作为文件夹名
heroname = jsonobj["hero"]["name"]
print(heroname)
isExists=os.path.exists(cur_path+'/所有皮肤图片/'+heroname)
skinpath =cur_path+'/所有皮肤图片/'+heroname
if not isExists:
os.makedirs(cur_path+'/所有皮肤图片/'+heroname)
# print(heroname)
#获取所有的皮肤
heroskins = jsonobj["skins"]
# print(heroskins)
for s in heroskins:
skinname = str(s["name"]).replace(' ','-').replace('/','') #皮肤名字
skinimage = str(s["mainImg"]) #皮肤图片路径
if(len(skinimage)!=0):
file_suffix = os.path.splitext(skinimage)[1]
filename = '{}{}{}{}'.format(skinpath,os.sep,skinname,file_suffix)
urllib.request.urlretrieve(skinimage,filename)
# print(skinimage)
其实我写这个项目的时候,就是自己的一个非常偶然的想法,也是我刚学习python的一个练手项目,回头去百度上一查,呃,发现好多好多人已经写过获取英雄联盟图片的项目了,比我写的好多了。所以我的就参考一下就好。