经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python3 » 查看文章
Python3爬取英雄联盟英雄皮肤大图实例代码
来源:jb51  时间:2018/11/15 10:06:01  对本文有异议

爬虫思路

初步尝试

我先查看了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

完整代码

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

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4. 抓取英雄联盟英雄全皮肤
  5. author: gxcuizy
  6. date: 2018-11-13
  7. """
  8. import requests
  9. import json
  10. from urllib import parse
  11. import os
  12. class GetLolSkin(object):
  13. """抓取LOL英雄皮肤"""
  14. def __init__(self):
  15. """初始化变量"""
  16. self.hero_url = 'https://lol.qq.com/biz/hero/champion.js'
  17. self.hero_detail_url = 'http://lol.qq.com/biz/hero/'
  18. self.skin_folder = 'skin'
  19. self.skin_url = 'https://ossweb-img.qq.com/images/lol/web201310/skin/big'
  20. @staticmethod
  21. def get_html(url):
  22. """下载html"""
  23. request = requests.get(url)
  24. request.encoding = 'gbk'
  25. if request.status_code == 200:
  26. return request.text
  27. else:
  28. return "{}"
  29. def get_hero_list(self):
  30. """获取英雄的完整信息列表"""
  31. hero_js = self.get_html(self.hero_url)
  32. # 删除左右的多余信息,得到json数据
  33. out_left = "if(!LOLherojs)var LOLherojs={};LOLherojs.champion="
  34. out_right = ';'
  35. hero_list = hero_js.replace(out_left, '').rstrip(out_right)
  36. return json.loads(hero_list)
  37. def get_hero_info(self, hero_id):
  38. """获取英雄的详细信息"""
  39. # 获取js详情
  40. detail_url = parse.urljoin(self.hero_detail_url, hero_id + '.js')
  41. detail_js = self.get_html(detail_url)
  42. # 删除左右的多余信息,得到json数据
  43. out_left = "if(!herojs)var herojs={champion:{}};herojs['champion'][%s]=" % hero_id
  44. out_right = ';'
  45. hero_info = detail_js.replace(out_left, '').rstrip(out_right)
  46. return json.loads(hero_info)
  47. def download_skin_list(self, skin_list, hero_name):
  48. """下载皮肤列表"""
  49. # 循环下载皮肤
  50. for skin_info in skin_list:
  51. # 拼接图片名字
  52. if skin_info['name'] == 'default':
  53. skin_name = '默认皮肤'
  54. else:
  55. if ' ' in skin_info['name']:
  56. name_info = skin_info['name'].split(' ')
  57. skin_name = name_info[0]
  58. else:
  59. skin_name = skin_info['name']
  60. hero_skin_name = hero_name + '-' + skin_name + '.jpg'
  61. self.download_skin(skin_info['id'], hero_skin_name)
  62. def download_skin(self, skin_id, skin_name):
  63. """下载皮肤图片"""
  64. # 下载图片
  65. img_url = self.skin_url + skin_id + '.jpg'
  66. request = requests.get(img_url)
  67. if request.status_code == 200:
  68. print('downloading……%s' % skin_name)
  69. img_path = os.path.join(self.skin_folder, skin_name)
  70. with open(img_path, 'wb') as img:
  71. img.write(request.content)
  72. else:
  73. print('img error!')
  74. def make_folder(self):
  75. """初始化,创建图片文件夹"""
  76. if not os.path.exists(self.skin_folder):
  77. os.mkdir(self.skin_folder)
  78. def run(self):
  79. # 获取英雄列表信息
  80. hero_json = self.get_hero_list()
  81. hero_keys = hero_json['keys']
  82. # 循环遍历英雄
  83. for hero_id, hero_code in hero_keys.items():
  84. hero_name = hero_json['data'][hero_code]['name']
  85. hero_info = self.get_hero_info(hero_id)
  86. if hero_info:
  87. skin_list = hero_info['result'][hero_id]['skins']
  88. # 下载皮肤
  89. self.download_skin_list(skin_list, hero_name)
  90. else:
  91. print('英雄【%s】的皮肤获取有问题……' % hero_name)
  92. # 程序执行入口
  93. if __name__ == '__main__':
  94. lol = GetLolSkin()
  95. # 创建图片存储文件
  96. lol.make_folder()
  97. # 执行脚本
  98. lol.run()

总结

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号