1. 分析网页数据

1.1 全部英雄网页:https://lol.qq.com/data/info-heros.shtml
1.2 查找获取所有英雄信息的地址
1.3 获取全部英雄的请求地址和请求方法

1.4 获取全部英雄的请求头部

1.5 获取全部英雄数据预览

1.6 同样的方法获取单个英雄的皮肤列表数据接口【以黑暗之女为例】

2 爬取所有英雄信息

  1. 设置全局变量保存英雄列表地址、皮肤列表地址、皮肤图片保存文件夹、公用头部;
  2. 使用 requests 获取【英雄列表地址】返回的所有英雄信息;
def __init__(self):self.heroListUrl = 'https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js'self.heroSkinsUrl = 'https://game.gtimg.cn/images/lol/act/img/js/hero/'self.skinsFolder = 'lol_skins'self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36","Referer": "https://lol.qq.com/"}def getCurrentUrlData(self, url):"""获取传入地址的数据"""results = Nonetry:res = requests.get(url, headers = self.headers)results = json.loads(res.text)except Exception as e:print(e)return '获取【{}】数据失败!'.format(url)else:return resultsdef getHeroList(self):"""获取英雄列表"""heroList = self.getCurrentUrlData(self.heroListUrl)['hero']return heroList

3 获取当前英雄的皮肤信息列表

  1. 循环英雄列表获取当前英雄的heroId;
  2. 根据英雄的 heroId ,获取英雄的皮肤列表;
def loopHeroListGetHeroId(self):"""循环英雄列表获取当前英雄的heroId"""for hero in self.heroList:skinsList = self.getHeroSkinsList(hero.get('heroId'))self.downloadSkinsList(skinsList)def getHeroSkinsList(self, heroId):"""获取当前英雄皮肤列表"""heroSkinsList = self.getCurrentUrlData('{}{}{}'.format(self.heroSkinsUrl, heroId, '.js'))['skins']return heroSkinsList

4 循环皮肤列表下载皮肤

  1. 循环皮肤列表,获取当前皮肤信息;
  2. 下载皮肤,获取 name,mainImg;
  3. 判断 mainImg 不为空字符串;
  4. requests 获取 mainImg 图片内容;
  5. 如果成功,写入 imgPath 文件。
def downloadSkin(self, skinInfo):"""根据传入皮肤信息,下载当前皮肤"""try:skinName = '{}{}'.format(skinInfo.get('name').replace('/','.'),'.jpg')skinId = skinInfo.get('skinId')mainImg = skinInfo.get('mainImg')# mainImg = 'https://game.gtimg.cn/images/lol/act/img/skin/big{}.jpg'.format(skinId)if mainImg != "":request = requests.get(mainImg)if request.status_code == 200:imgPath = os.path.join(self.skinsFolder, skinName)with open(imgPath, 'wb') as img:print('【{}】图片下载成功!'.format(skinInfo.get('name').replace('/','.')))img.write(request.content)else:print('【{}】图片下载失败!'.format(skinInfo.get('name').replace('/','.')))except Exception as e:print(e)print('{} 下载失败'.format(skinName))print('{} 下载失败图片地址'.format(mainImg))def downloadSkinsList(self, skinsList):"""循环皮肤列表获取当前皮肤信息"""for skin in skinsList:self.downloadSkin(skin)

5 完整代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
# https://lol.qq.com/data/info-heros.shtml
@Author  :Rattenking
@Date    :2021/02/22 16:19
@CSDN   :https://blog.csdn.net/m0_38082783
"""
import os
import json
import time
import requestsclass DownloadLOLSkin():def __init__(self):self.heroListUrl = 'https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js'self.heroSkinsUrl = 'https://game.gtimg.cn/images/lol/act/img/js/hero/'self.skinsFolder = 'lol_skins'self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36","Referer": "https://lol.qq.com/"}def getCurrentUrlData(self, url):"""获取传入地址的数据"""results = Nonetry:res = requests.get(url, headers = self.headers)results = json.loads(res.text)except Exception as e:print(e)return '获取【{}】数据失败!'.format(url)else:return resultsdef getHeroList(self):"""获取英雄列表"""heroList = self.getCurrentUrlData(self.heroListUrl)['hero']return heroListdef getHeroSkinsList(self, heroId):"""获取当前英雄皮肤列表"""heroSkinsList = self.getCurrentUrlData('{}{}{}'.format(self.heroSkinsUrl, heroId, '.js'))['skins']return heroSkinsListdef downloadSkin(self, skinInfo):"""根据传入皮肤信息,下载当前皮肤"""try:skinName = '{}{}'.format(skinInfo.get('name').replace('/','.'),'.jpg')skinId = skinInfo.get('skinId')mainImg = skinInfo.get('mainImg')# mainImg = 'https://game.gtimg.cn/images/lol/act/img/skin/big{}.jpg'.format(skinId)if mainImg != "":request = requests.get(mainImg)if request.status_code == 200:imgPath = os.path.join(self.skinsFolder, skinName)with open(imgPath, 'wb') as img:print('【{}】图片下载成功!'.format(skinInfo.get('name').replace('/','.')))img.write(request.content)else:print('【{}】图片下载失败!'.format(skinInfo.get('name').replace('/','.')))except Exception as e:print(e)print('{} 下载失败'.format(skinName))print('{} 下载失败图片地址'.format(mainImg))def downloadSkinsList(self, skinsList):"""循环皮肤列表获取当前皮肤信息"""for skin in skinsList:self.downloadSkin(skin)def loopHeroListGetHeroId(self):"""循环英雄列表获取当前英雄的heroId"""for hero in self.heroList:skinsList = self.getHeroSkinsList(hero.get('heroId'))self.downloadSkinsList(skinsList)def createFolder(self):"""创建存放皮肤的文件夹"""if not os.path.exists(self.skinsFolder):os.mkdir(self.skinsFolder)def run(self):"""运行当前脚本"""self.createFolder()self.heroList = self.getHeroList()startTime = int(round(time.time() * 1000))self.loopHeroListGetHeroId()endTime = int(round(time.time() * 1000))print('本次批量下载用时:{} ms'.format(endTime - startTime))if __name__ == '__main__':lol = DownloadLOLSkin()# 执行脚本lol.run()

8 结果预览

7 总结

  1. 下载方法中可以采用获取皮肤id进行下载皮肤;

    mainImg = 'https://game.gtimg.cn/images/lol/act/img/skin/big{}.jpg'.format(skinId)
    
  2. 由于在 mainImg 为空字符串时,通过皮肤id获取的下载地址可能下载失败,但是增加了请求次数,所以文章采用的是直接获取 mainImg 字段下载皮肤;
  3. 保存皮肤文件夹的创建和判断 createFolder;
  4. 由于数据较多,建议不要采用递归下载皮肤,直接采用循环。

【Python实战】 ---- 爬虫 爬取LOL英雄皮肤图片相关推荐

  1. Python爬取游戏英雄皮肤图片 王者+LOL

    最近学了一点爬虫的知识,就拿游戏里面的皮肤图片做对象进行练习. 爬虫: 网络爬虫(又被称为网页蜘蛛,网络机器人)就是模拟浏览器发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序 ...

  2. python实战:爬取优美图库,将图片格式的本地存储

    import requests from bs4 import BeautifulSoup import time 解析主页面原代码,提取子页面url 通过子页面拿取内容,找到图片的下载地址 下载图片 ...

  3. 用python网络爬虫爬取英雄联盟英雄图片

    用python爬虫爬取lol皮肤. 这也用python网络爬虫爬取lol英雄皮肤,忘了是看哪个大神的博客(由于当时学了下就一直放在这儿,现在又才拿出来,再加上马上要考二级挺忙的.),代码基本上是没改, ...

  4. 如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)

    前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往下继续深入. 一.代码实现 1.修改Scrapy项目中的items.py ...

  5. python朋友圈动态_如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)

    前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往下继续深入. 一.代码实现 1.修改Scrapy项目中的items.py ...

  6. python抓取朋友圈动态_如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)...

    原标题:如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下) 前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往 ...

  7. Python实战,爬取金融期货数据

    大家好,我是毕加锁. 今天给大家带来的是 Python实战,爬取金融期货数据 文末送书! 文末送书! 文末送书! 任务简介   首先,客户原需求是获取https://hq.smm.cn/copper网 ...

  8. Python爬虫爬取煎蛋网图片代码实例

    这篇文章主要介绍了Python爬虫爬取煎蛋网图片代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天,试着爬取了煎蛋网的图片. 用到的包: ...

  9. python爬电影_使用Python多线程爬虫爬取电影天堂资源

    最近花些时间学习了一下Python,并写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址,代码已经上传到GitHub上了,需要的同学可以自行下载.刚开始学习python希望可以获得宝贵的意见. ...

最新文章

  1. python之re模块
  2. python 标准差Std() 参数决定有偏或无偏
  3. ASP.NET内置对象的总结
  4. python中的浅拷贝和深拷贝
  5. Build OpenVSwitch and OVN
  6. JavaScript内置对象Date----格式化时间
  7. vue.js的项目实战
  8. c语言删除一个字符指令,【C语言】实现一个基于命令行的文本编辑器
  9. 关于×××隧道技术在使用中的优势
  10. TCP通信之获取本机IPV4地址
  11. tomcat集群的failover机制
  12. ANDROID 获得地理位置
  13. mysql 刷新二进制日志_mysql binglog 二进制日志文件
  14. Spark分组取TopN
  15. 【android原生态RPG游戏框架源码】
  16. 软件测试面试题:Jmeter怎么录制脚本,怎么过滤,线程组有哪些内容?
  17. 【优亿 Android前线快报】 第76期
  18. 优点电子签章系统无法解除_电子签章常见问题解答
  19. python 序列去重并保持原始顺序
  20. 8家供应商、2300个特效镜头,ftrack助力《侍神令》协同制作

热门文章

  1. 阿里大文娱——优酷场景化营销
  2. 超市结算系统软件测试,软件测试报告-超市管理系统【参考】.doc
  3. Bcftools的下载与安装
  4. google.api.http
  5. Server2012R2下安装intel 82579v网卡驱动
  6. 工作流之通用数据表设计
  7. 304钢好还是316钢的区别
  8. Bat调用/弹出文件或文件夹选择对话框
  9. ON/安森美FCH041N65F车规级MOS管,原厂渠道ASEMI代理
  10. c语言之打印输出图形