先来看一张图片。


先讲解下思路,然后直接放源码,想要获取源码的同学直接拉到最下面就好。

1.爬虫第一步

首先要分析网页的DOM结构,就是英雄联盟官网,然后在下面找到英雄资料。然后在这里发现一个神奇的文件hero_list.js,打开看一下,结构是这样的。



用python秒选英雄联盟英雄 python 英雄联盟脚本_json


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的一个练手项目,回头去百度上一查,呃,发现好多好多人已经写过获取英雄联盟图片的项目了,比我写的好多了。所以我的就参考一下就好。