Python3爬取英雄联盟英雄皮肤大图实例代码


Posted in Python onNovember 14, 2018

爬虫思路

初步尝试

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

Python3爬取英雄联盟英雄皮肤大图实例代码

继续尝试

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

Python3爬取英雄联盟英雄皮肤大图实例代码

接着尝试

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

Python3爬取英雄联盟英雄皮肤大图实例代码

最后尝试

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

Python3爬取英雄联盟英雄皮肤大图实例代码

思路总结

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

Python3爬取英雄联盟英雄皮肤大图实例代码

运行环境

Python运行环境:python3.6

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

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

完整代码

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
抓取英雄联盟英雄全皮肤
author: gxcuizy
date: 2018-11-13
"""
import requests
import json
from urllib import parse
import os
class 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'
  @staticmethod
  def get_html(url):
    """下载html"""
    request = requests.get(url)
    request.encoding = 'gbk'
    if request.status_code == 200:
      return request.text
    else:
      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_id
    out_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()

总结

以上所述是小编给大家介绍的Python3爬取英雄联盟英雄皮肤大图实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python单元测试框架unittest简明使用实例
Apr 13 Python
Python实现的简单算术游戏实例
May 26 Python
举例简单讲解Python中的数据存储模块shelve的用法
Mar 03 Python
Python过滤列表用法实例分析
Apr 29 Python
python 文件操作删除某行的实例
Sep 04 Python
Django+Ajax+jQuery实现网页动态更新的实例
May 28 Python
Python中函数的基本定义与调用及内置函数详解
May 13 Python
python实现雪花飘落效果实例讲解
Jun 18 Python
python pytest进阶之conftest.py详解
Jun 27 Python
Python hmac模块使用实例解析
Dec 24 Python
python 服务器运行代码报错ModuleNotFoundError的解决办法
Sep 16 Python
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
May 28 Python
python 顺时针打印矩阵的超简洁代码
Nov 14 #Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
Nov 14 #Python
Python实现常见的回文字符串算法
Nov 14 #Python
Python 单元测试(unittest)的使用小结
Nov 14 #Python
python for循环输入一个矩阵的实例
Nov 14 #Python
python获取中文字符串长度的方法
Nov 14 #Python
对python插入数据库和生成插入sql的示例讲解
Nov 14 #Python
You might like
WML,Apache,和 PHP 的介绍
2006/10/09 PHP
php中简单的对称加密算法实现
2017/01/05 PHP
提高网站信任度的技巧
2008/10/17 Javascript
实现超用户体验 table排序javascript实现代码
2009/06/22 Javascript
JavaScript 获取用户客户端操作系统版本
2009/08/25 Javascript
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
js判断页面中是否有指定控件的简单实例
2014/03/04 Javascript
js网页右下角提示框实例
2014/10/14 Javascript
扩展bootstrap的modal模态框-动态添加modal框-弹出多个modal框
2017/02/21 Javascript
vue 中自定义指令改变data中的值
2017/06/02 Javascript
无限循环轮播图之运动框架(原生JS实现)
2017/10/01 Javascript
js用类封装pop弹窗组件
2017/10/08 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
2018/01/12 Javascript
vue裁切预览组件功能的实现步骤
2018/05/04 Javascript
通过实例解析js简易模块加载器
2019/06/17 Javascript
jQuery中event.target和this的区别详解
2020/08/13 jQuery
[01:02:04]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
Python linecache.getline()读取文件中特定一行的脚本
2008/09/06 Python
用Python实现斐波那契(Fibonacci)函数
2016/03/25 Python
python日期时间转为字符串或者格式化输出的实例
2018/05/29 Python
Python实现微信小程序支付功能
2019/07/25 Python
python爬虫-模拟微博登录功能
2019/09/12 Python
python PIL/cv2/base64相互转换实例
2020/01/09 Python
python应用Axes3D绘图(批量梯度下降算法)
2020/03/25 Python
英国灯具和灯泡网上商店:Lights.co.uk
2018/02/02 全球购物
bareMinerals官网:矿物质化妆品和护肤品
2018/02/04 全球购物
eBay瑞士购物网站:eBay.ch
2018/12/24 全球购物
令人啧啧称赞的经理推荐信
2013/11/07 职场文书
双语教学实施方案
2014/03/23 职场文书
征兵宣传标语
2014/06/20 职场文书
干部作风建设心得体会
2014/10/22 职场文书
鼋头渚导游词
2015/02/05 职场文书
十一月早安语录:把心放轻,人生就是一朵自在的云
2019/11/04 职场文书
在HTML5 localStorage中存储对象的示例代码
2021/04/21 Javascript
Win11安装受阻怎么办? Windows11安装问题与解决方案汇总
2021/11/21 数码科技
Go gorilla securecookie库的安装使用详解
2022/08/14 Golang