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


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

     

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

    拿到几种图片链接分析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)

  • 相关阅读:
    PostgreSQL学习的九层宝塔
    MySQL和PostgreSQL在多表连接算法上的差异
    覆盖equals 时总要覆盖hashCode(9)
    覆盖equals 时总要覆盖hashCode(9)
    覆盖equals 时总要覆盖hashCode(9)
    覆盖equals 时总要覆盖hashCode(9)
    SQL Server 字段和对应的说明操作(SQL Server 2005 +)
    SQL Server 字段和对应的说明操作(SQL Server 2005 +)
    SQL Server 字段和对应的说明操作(SQL Server 2005 +)
    SQL Server 字段和对应的说明操作(SQL Server 2005 +)
  • 原文地址:https://www.cnblogs.com/ilovepython/p/11540017.html
Copyright © 2020-2023  润新知