爬取英雄联盟所有英雄皮肤

Posted ilovepython

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬取英雄联盟所有英雄皮肤相关的知识,希望对你有一定的参考价值。

 

我们通过分析英雄联盟官网页面,进入到资料库页面,分析英雄所在的页面

技术图片

 

 技术图片

 

 这里有两种类型的同样的图片,一种是大图片的,一种是类似头像的小图片。我们这里抓取大图片

拿到几种图片链接分析https://game.gtimg.cn/images/lol/act/img/skin/big5000.jpg可以发现所有英雄皮肤链接url除了数字之前的都一样,而且后面的数字都是以英雄id+三位数拼接而成(三位数从000开始,但是有的英雄并不是就是依次排列,可能000,,001,002会直接跳到013)

 

由于英雄联盟官网也是做了反爬措施了的,所有图片也是使用局部加载的方式,在开发者工作中,可以找到一个js文件,里面包含了英雄id与英雄的对应关系

技术图片

 

 

通过请求该js,获取其源代码,使用正则表达式将其提取出来,用于后面的url拼接

代码如下:

import requests
import re
import json
# 请求js数据,获取英雄对应的代码
#       "92": "Riven",
#         "68": "Rumble",
#         "13": "Ryze",
#         "113": "Sejuani",
def path_js(url):
    # 通过js源码,获取字节数据
    response = requests.get(url).content.decode(gb2312)
    req = "keys":(.*?),"data"
    # 将字符串转成正则对象
    # req = re.compile(req)
    list_js = re.findall(req,response)
    dict_js = json.loads(list_js[0])
    # print(dict_js)
    # print(len(dict_js))
    return dict_js


https://game.gtimg.cn/images/lol/act/img/skin/big21003.jpg
# LOL 皮肤链接除了前面的https://game.gtimg.cn/images/lol/act/img/skin/big都一样外,后面的数字采用
# 英雄的代码+三位数(从000开始,但是中间可能会跳,如001,002,003,012,013...)

# 拼接图片url
def path_url(dict_js):
    list_pic = []
    for key in dict_js:
        # 假设后面的数字到25,后面通过url访问是否成功判断是否有效
        for item in range(25):
            item = str(item)
            # item一位数拼接两个0
            if len(item) == 1:
                hero_item = 00 + item
            # item一位数拼接一个0
            elif len(item) == 2:
                hero_item = 0 + item
            # 拼接完整数字
            numbers_str = key + hero_item
            # print(numbers_str)
            # 拼接完整图片url
            url = https://game.gtimg.cn/images/lol/act/img/skin/big + numbers_str + .jpg
            # 将所有拼接的图片url保存至列表
            list_pic.append(url)
    return list_pic

# 拼接图片名称
def name_pic(dict_js,path):
    list_file_path = []
    for name in dict_js.values():
        for item in range(25):
            file_path = path + name + str(item) + .jpg
            list_file_path.append(file_path)
    return list_file_path

# 保存图片
def save_pic(list_pic,list_file_path):
    for item in range(len(list_pic)):
        res = requests.get(list_pic[item])
        if res.status_code == 200:
            print(正在下载%s%list_file_path[item])
            with open(list_file_path[item],wb)as fp:
                fp.write(res.content)
    print(所有皮肤全部下载完毕!)

if __name__ == __main__:
    url = https://lol.qq.com/biz/hero/champion.js
    path = LOL\\\\
    # 获取英雄对应id,返回字典数据
    dict_js = path_js(url)
    # 拼接完整的图片url,返回列表数据
    list_pic = path_url(dict_js)
    # 拼接完整的图片保存路径,返回列表数据
    list_file_path = name_pic(dict_js,path)
    # 根据图片url列表和路径列表,保存图片
    save_pic(list_pic,list_file_path)

技术图片

 

以上是关于爬取英雄联盟所有英雄皮肤的主要内容,如果未能解决你的问题,请参考以下文章

我用Python爬取英雄联盟的皮肤,你试试看,你行吗?

英雄联盟Python爬虫

英雄联盟Python爬虫

用Python爬取英雄联盟(lol)全部皮肤

爬虫小程序(爬取英雄联盟的英雄皮肤)

我用Python爬取英雄联盟的皮肤,隔壁家的小弟弟都馋哭了