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将阿拉伯数字转换为罗马数字的方法
Jul 10 Python
Python实现全角半角字符互转的方法
Nov 28 Python
利用Python循环(包括while&for)各种打印九九乘法表的实例
Nov 06 Python
python监控进程脚本
Apr 12 Python
python生成每日报表数据(Excel)并邮件发送的实例
Feb 03 Python
Python 解码Base64 得到码流格式文本实例
Jan 09 Python
Python greenlet和gevent使用代码示例解析
Apr 01 Python
Spark处理数据排序问题如何避免OOM
May 21 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
Jun 30 Python
Python字典dict常用方法函数实例
Nov 09 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
Nov 13 Python
python如何利用cv2模块读取显示保存图片
Jun 04 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
同一空间绑定多个域名而实现访问不同页面的PHP代码
2006/12/06 PHP
php-accelerator网站加速PHP缓冲的方法
2008/07/30 PHP
PHP正则表达式之定界符和原子介绍
2012/10/05 PHP
ThinkPHP CURD方法之data方法详解
2014/06/18 PHP
ThinkPHP实现动态包含文件的方法
2014/11/29 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
2014/12/19 PHP
php动态绑定变量的用法
2015/06/16 PHP
php微信公众平台配置接口开发程序
2016/09/22 PHP
php闭包中使用use声明变量的作用域实例分析
2018/08/09 PHP
PHP fclose函数用法总结
2019/02/15 PHP
这段js代码得节约你多少时间
2011/12/20 Javascript
seajs中模块的解析规则详解和模块使用总结
2014/03/12 Javascript
javascript获取本机操作系统类型的方法
2015/08/13 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
2015/09/07 Javascript
window.location.reload 刷新使用分析(去对话框)
2015/11/11 Javascript
jQuery中deferred对象使用方法详解
2016/07/14 Javascript
浅谈javascript中的三种弹窗
2016/10/21 Javascript
用Angular实时获取本地Localstorage数据,实现一个模拟后台数据登入的效果
2016/11/09 Javascript
Angular搜索 过滤 批量删除 添加 表单验证功能集锦(实例代码)
2017/10/25 Javascript
ajax前台后台跨域请求处理方式
2018/02/08 Javascript
webpack4.0 入门实践教程
2018/10/08 Javascript
JavaScript链式调用实例浅析
2018/12/19 Javascript
JS学习笔记之贪吃蛇小游戏demo实例详解
2019/05/29 Javascript
超详细的5个Shell脚本实例分享(值得收藏)
2019/08/15 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
vue路由分文件拆分管理详解
2020/08/13 Javascript
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
2019/05/10 Python
Python 正则表达式爬虫使用案例解析
2019/09/23 Python
Python爬虫爬取Bilibili弹幕过程解析
2019/10/10 Python
Python DES加密实现原理及实例解析
2020/07/17 Python
领先的荷兰线上超市:荷兰之家Holland at Home(支持中文)
2021/01/21 全球购物
运动会广播稿200字
2014/01/15 职场文书
骨干教师事迹材料
2014/12/17 职场文书
毕业生个人自荐书
2015/03/05 职场文书
幼儿园教学工作总结2015
2015/05/12 职场文书
Golang的继承模拟实例
2021/06/30 Golang