前言

之前一直想爬取LOL英雄皮肤的高清图片,最近有事,也没怎么去研究,所以,现在才去看了下,并且写了Python脚本来抓取皮肤图片。需要说明一下,这个脚本有部分英雄没有抓取到,但是具体原因,我目前还没搞懂,我是相当纳闷的。大家有兴趣的,可以看看后面遗留问题,一起研究下。

爬虫思路

初步尝试

我先查看了network,并没有发现有可用的API;然后又用bs4去分析英雄列表页,但是请求到html里面,并没有英雄列表,在英雄列表的节点上,只有“正在加载中”这样的字样;同样的方法,分析英雄详情也是这种情况,所以我猜测,这些数据应该是Javascript负责加载的。

继续尝试

然后我就查看了英雄列表的源代码,查看外部引入的js文件,以及行内的js脚本,大概在368行,发现了有处理英雄列表的js注释,然后继续往下读这些代码,发现了第一个彩蛋,也就是他引入了一个champion.js的文件,我猜测,这个应该就是英雄列表大全了,然后我打开了这个链接的js,一眼看过去,黑麻麻一片,然后格式化了一下压缩的js,确定这就是英雄列表的js数据文件了。

接着尝试

前面通过查看列表的源代码,找到了英雄列表的js数据文件,那么,我继续随机点开了一个英雄的详情,然后查看英雄详情源代码,然后大概在568行看到有一个showSkin的js方法,通过这里,发现了第二个彩蛋,也就是皮肤图片的URL地址拼接方法。

最后尝试

上面找到了皮肤图片URL的拼接方法,并且发现了一行很关键的代码var skin =LOLherojs.champion[heroid].data.skins,也就是,这个skin变量,就是英雄皮肤的所有图片数组,但是这个文件内,并没有LOLherojs这个变量,也就是外部引入的,所以,需要继续查看下面的源代码,找到引入这个变量的位置,果不其然,在757行,发现了最后一个彩蛋,也就是,英雄皮肤的js文件,通过这里可以知道,每个英雄都有一个单独的js文件,并且知道了这个js文件的URL拼接方法。

思路总结

通过上面的分析,我们就得到了爬取LOL皮肤图片的所有数据准备了,也就是,直接,只需要提取js中的英雄列表以及英雄详情数据,就可实现我们的需求了。下面是运行后抓取到的图片……

运行环境

Python运行环境:python3.6

用到的模块:requests、json、urllib、os

未安装的模块,请使用pip instatll进行安装,例如:pip install requests

完整代码

其他啥的废话就不多说了,直接上完整代码。再说明一下,那些有问题的英雄详情的js文件,大家有时间也可以琢磨下,或者有其他的更加快捷的爬取这些图片的方法,也可以拿出来交流和讨论,谢谢。

#!/usr/bin/env python# -*- coding: utf-8 -*-"""抓取英雄联盟英雄全皮肤author: gxcuizydate: 2018-11-13"""import requestsimport jsonfrom urllib import parseimport osclass GetLolSkin(object):"""抓取LOL英雄皮肤"""def __init__(self):"""初始化变量"""self.hero_url = 'https://lol.qq.com/biz/hero/champion.js'self.hero_detail_url = 'http://lol.qq.com/biz/hero/'self.skin_folder = 'skin'self.skin_url = 'https://ossweb-img.qq.com/images/lol/web201310/skin/big'@staticmethoddef get_html(url):"""下载html"""request = requests.get(url)request.encoding = 'gbk'if request.status_code == 200:return request.textelse:return "{}"def get_hero_list(self):"""获取英雄的完整信息列表"""hero_js = self.get_html(self.hero_url)# 删除左右的多余信息,得到json数据out_left = "if(!LOLherojs)var LOLherojs={};LOLherojs.champion="out_right = ';'hero_list = hero_js.replace(out_left, '').rstrip(out_right)return json.loads(hero_list)def get_hero_info(self, hero_id):"""获取英雄的详细信息"""# 获取js详情detail_url = parse.urljoin(self.hero_detail_url, hero_id + '.js')detail_js = self.get_html(detail_url)# 删除左右的多余信息,得到json数据out_left = "if(!herojs)var herojs={champion:{}};herojs['champion'][%s]=" % hero_idout_right = ';'hero_info = detail_js.replace(out_left, '').rstrip(out_right)return json.loads(hero_info)def download_skin_list(self, skin_list, hero_name):"""下载皮肤列表"""# 循环下载皮肤for skin_info in skin_list:# 拼接图片名字if skin_info['name'] == 'default':skin_name = '默认皮肤'else:if ' ' in skin_info['name']:name_info = skin_info['name'].split(' ')skin_name = name_info[0]else:skin_name = skin_info['name']hero_skin_name = hero_name + '-' + skin_name + '.jpg'self.download_skin(skin_info['id'], hero_skin_name)def download_skin(self, skin_id, skin_name):"""下载皮肤图片"""# 下载图片img_url = self.skin_url + skin_id + '.jpg'request = requests.get(img_url)if request.status_code == 200:print('downloading……%s' % skin_name)img_path = os.path.join(self.skin_folder, skin_name)with open(img_path, 'wb') as img:img.write(request.content)else:print('img error!')def make_folder(self):"""初始化,创建图片文件夹"""if not os.path.exists(self.skin_folder):os.mkdir(self.skin_folder)def run(self):# 获取英雄列表信息hero_json = self.get_hero_list()hero_keys = hero_json['keys']# 循环遍历英雄for hero_id, hero_code in hero_keys.items():hero_name = hero_json['data'][hero_code]['name']hero_info = self.get_hero_info(hero_id)if hero_info:skin_list = hero_info['result'][hero_id]['skins']# 下载皮肤self.download_skin_list(skin_list, hero_name)else:print('英雄【%s】的皮肤获取有问题……' % hero_name)# 程序执行入口if __name__ == '__main__':lol = GetLolSkin()# 创建图片存储文件lol.make_folder()# 执行脚本lol.run()

公众号:Python大咖那些事

关注领取更多资料,每日更新Python相关技术文!

Python开发学习交流群:705673780,一起学习交流哦

Python3爬取英雄联盟英雄皮肤大图相关推荐

  1. python英雄联盟脚本是什么_Python3爬取英雄联盟英雄皮肤大图实例代码

    爬虫思路 初步尝试 我先查看了network,并没有发现有可用的API:然后又用bs4去分析英雄列表页,但是请求到html里面,并没有英雄列表,在英雄列表的节点上,只有"正在加载中" ...

  2. python3爬虫之多线程爬取英雄联盟所有皮肤图片

    python3爬虫之多线程爬取英雄联盟所有皮肤图片 线程不要太高,容易出错,大约用时1分钟左右. import requests import json import os import thread ...

  3. 【Python爬虫系列教程 18-100】Python网络爬虫实战:小姐姐手把手教你爬取并下载英雄联盟所有英雄皮肤高清大图

    文章目录 前言 一.分析页面 二.分析第二个页面 三.代码 四.下载结果 前言 上次教你怎么爬取王者荣耀,今天小姐姐教你使用几十行代码下载英雄联盟所有皮肤,你看我下载的九尾妖狐.

  4. 爬取英雄联盟所有皮肤图片实现千图成像~

    前文 本文主要分为两个部分 一部分是爬虫,这边是选择爬取英雄联盟官网英雄资料中的英雄皮肤图片,如下为新英雄seraphine的页面,包含英雄对应的所有皮肤: 另一部分是图片的合成,先将所有英雄皮肤图片 ...

  5. javaJsoup爬取LOL英雄联盟全皮肤

    javaJsoup爬取LOL英雄联盟全皮肤 配置maven <dependency><groupId>org.jsoup</groupId><artifact ...

  6. 【爬虫】使用requests爬取英雄联盟英雄皮肤

    使用requests爬取英雄联盟英雄皮肤 自己做的 import requestsresponse = requests.get("https://game.gtimg.cn/images/ ...

  7. 【Python爬虫】爬取英雄联盟所有皮肤图片实现千图成像~

    前文 本文主要分为两个部分 一部分是爬虫,这边是选择爬取英雄联盟官网英雄资料中的英雄皮肤图片,如下为新英雄seraphine的页面,包含英雄对应的所有皮肤: 另一部分是图片的合成,先将所有英雄皮肤图片 ...

  8. python3+scrapy+selenium爬取英雄联盟英雄资料

    继前一篇文章用nodejs+puppeteer+chromium爬取了这个英雄资料后,在本篇同样爬这个页面,思路都差不多,只是用不同语言来实现,可作为参考,个人觉得爬虫还是nodejs比较好用,可能是 ...

  9. 教你用python爬取王者荣耀英雄皮肤图片,并将图片保存在各自英雄的文件夹中。(附源码)

    教你用python爬取王者荣耀英雄皮肤图片,并将图片保存在各自英雄的文件夹中.(附源码) 代码展示: 保存在各自的文件夹中 美么? 让我们开始爬虫之路 开发环境 windows 10 python3. ...

最新文章

  1. 使用Caffe进行手写数字识别执行流程解析
  2. 俄罗斯显卡测试软件,《战地1》正式版显卡测试:EA教众厂商什么叫优化
  3. Console控制台的正确打开方式
  4. UIKeyboardTypeNumberPad 数字键盘添加完成按钮
  5. 智慧城市成为国家战略 浙江同兴股份乘势迈进
  6. java生成首字母拼音简码的总结
  7. ES6语法的学习与实践
  8. 使用Docker Compose管理多个容器
  9. 准备让MSN机器人可以显示头像
  10. 解决 ImportError: No module named ‘pip._internal‘问题
  11. SSD测试专题(二)
  12. C# 使用RestSharp库实现POST请求
  13. python语言turtle库画图代码示例_5分钟轻松搞定,Python开发之turtle库的基本操作...
  14. 有机化学类毕业论文文献(推荐10篇)
  15. python bunch制作可导入数据_Python bunch包_程序模块 - PyPI - Python中文网
  16. linux字符串加引号,请问 命令行中写路径,加引号和不加有什么区别?
  17. 京东2023年Q1财报预测:短期增速承压,收入和净利润预测被下调
  18. i春秋首届全国数据安全大赛部分复盘
  19. 这几道tomcat面试题,最后两道难倒我了
  20. JAVA纺织代加工车间生产状态监测系统计算机毕业设计Mybatis+系统+数据库+调试部署

热门文章

  1. 人间词话抄录-浣溪沙 漠漠轻寒上小楼
  2. 用让新海诚本人惊讶的 AI 模型制作属于你的动漫视频
  3. Spring Cloud kubernetes入门项目sck-demo
  4. 服务器无法显示url,遇到“您所请求的网址(URL)无法获取”的解决办法
  5. D. Riverside Curio
  6. 对dz模板的一些注释
  7. 科学课和计算机整合,信息技术与科学课整合《风的形成》教学设计
  8. 解决Beyond Compare中文乱码问题
  9. 怎么引流微信 ,QQ,抖音,淘宝,微博,Facebook好友
  10. 苹果自带输入法怎么换行_Iphone手机原生输入法的5个技巧,学会了,才知道这么牛...