前文

本文主要分为两个部分

一部分是爬虫,这边是选择爬取英雄联盟官网英雄资料中的英雄皮肤图片,如下为新英雄seraphine的页面,包含英雄对应的所有皮肤;

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

另一部分是图片的合成,先将所有英雄皮肤图片拼接成为一张图作为背景,然后与另一张图片进行合成,效果如下:

爬虫

思路整理

F12打开控制台后刷新页面(https://lol.qq.com/data/info-defail.shtml?id=147),既然是找图片,直接在img标签下找就好了;

获取到图片的地址之后(https://game.gtimg.cn/images/lol/act/img/skin/big147001.jpg),接着再往下找,在xhr标签下,找到了包含皮肤图片地址的接口(https://game.gtimg.cn/images/lol/act/img/js/hero/147.js),测试一下,可以直接访问,没啥限制;

多看几个英雄的页面就能发现,这个147其实就是对应英雄的ID,如果我们有英雄的ID,直接拼接成新的接口地址就可以,接着继续往下找能获取英雄ID的接口;

在资料库首页刷新,有个叫hero_list(https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js)的就很明显,从返回的内容来看,确实包含了我们需要的英雄ID;

这样思路就很清晰了,先从hero_list获取所有英雄的ID,然后拼接成单个英雄信息的接口访问获取到皮肤图片的地址,下载图片完事~

完整代码

为了速度快点,加了一个异步,实测6S爬取完所有的皮肤~

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# @Author  : AwesomeTang

# @File    : crawler.py

# @Version : Python 3.7

# @Time    : 2020-11-06 23:05

import requests

import asyncio

import os

from aiohttp import ClientSession

import aiohttp

import json

from datetime import datetime

async def skins_downloader(semaphore, hero_id, hero_name):

async with semaphore:

url = 'https://game.gtimg.cn/images/lol/act/img/js/hero/{}.js'.format(hero_id)

dir_name = 'skins/{}'.format(hero_name)

if not os.path.exists(dir_name):

os.mkdir(dir_name)

async with ClientSession(connector=aiohttp.TCPConnector(ssl=False)) as session:

async with session.get(url) as response:

response = await response.read()

for skin in json.loads(response)['skins']:

if skin['mainImg']:

img_url = skin['mainImg']

# kda女团皮肤名带斜杠,replace掉

path = os.path.join(dir_name, '{}.jpg'.format(skin['name'].replace('/', ''), ))

async with session.get(img_url) as skin_response:

with open(path, 'wb') as f:

print('\rDownloading [{:^10}] {:<20}'.format(hero_name, skin['name']), end='')

f.write(await skin_response.read())

def hero_list():

return requests.get('https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js').json()['hero']

async def run():

semaphore = asyncio.Semaphore(30)

heroes = hero_list()

tasks = []

for hero in heroes:

tasks.append(asyncio.ensure_future(skins_downloader(semaphore, hero['heroId'], hero['title'])))

await asyncio.wait(tasks)

if __name__ == '__main__':

start_time = datetime.now()

loop = asyncio.get_event_loop()

loop.run_until_complete(run())

loop.close()

end_time = datetime.now()

time_diff = (end_time - start_time).seconds

print('\nTime cost: {}s'.format(time_diff))

每个英雄对应一个文件夹~

图片合成

图片尺寸处理

因为最后图片合成需要保持一样的尺寸,所以第一步我们先把主图的尺寸resize成我们想要的;

英雄皮肤的图片都是980*500,我们把皮肤图片尺寸缩小10倍也就是98*50,然后保证每行有50张子图,这样便得到了我们需要resize的宽度(98*50),然后根据主图本身的长宽比计算出我们需要resize的高度,具体代码如下:

mask_img = Image.open('/home/kesci/work/skins/league of legend.jpeg')

# 获取图片本身宽度、高度

width, height = mask_img.size

# 计算resize后的尺寸,注意取整

to_width = 98 * 50

to_height = ((to_width / width) * height // 50) * 50

mask_img = mask_img.resize((int(to_width), int(to_height)), Image.ANTIALIAS)

# 显示图片

plt.figure(figsize=(25,15))

plt.imshow(mask_img)

plt.axis('off')

plt.show()

子图拼接

接下来便是把英雄图片拼接成一张图片,尺寸与之前主图尺寸保持一致;

读取所有皮肤图片将尺寸resize为98*50,转为np.array格式缓存到list中共后面调用;

skin_array_collection = []

for fpath, dirname, fnames in os.walk('/home/kesci/work/skins'):

if not dirname:

for fn in fnames:

try:

skin_array_collection.append(np.array(Image.open(os.path.join(fpath, fn)).convert('RGB').resize((98, 50), Image.ANTIALIAS)))

except OSError:

print('读取文件出错:「{}」'.format(os.path.join(fpath, fn)))

将刚刚的array随机组合到一起,转为图片就好了~

w_times, h_times = int(to_width / 98), int(to_height / 50)

bg_img = np.zeros_like(np.array(mask_img))

for i in tqdm(range(w_times), desc='MERGE'):

for j in range(h_times):

bg_img[j * 50:(j + 1) * 50, i * 98:(i + 1) * 98, :] = random.choice(skin_array_collection)

bg_img = Image.fromarray(bg_img)

# 显示图片

plt.figure(figsize=(25,15))

plt.imshow(bg_img)

plt.axis('off')

plt.show()

图片合成

这边使用了Pillow中的Image.blend,将主图和刚才生成的皮肤背景图合成到一起,通过alpha参数控制背景的透明程度;

img = Image.blend(bg_img, mask_img, alpha=0.8)

img.save('/home/kesci/work/skins/out_put.jpeg')

# 显示图片

plt.figure(figsize=(25,15))

plt.imshow(img)

plt.axis('off')

plt.show()

效果如下:

千图成像python_爬取英雄联盟所有皮肤图片实现千图成像!Python真强!!相关推荐

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

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

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

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

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

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

  4. Python爬取英雄联盟全皮肤

    Python爬取英雄联盟皮肤 打开英雄联盟官网:https://lol.qq.com,点击游戏资料,按F12进入开发者模式.刷新,找到hero_list.js,里面有我们需要的网址以及其他信息. 代码 ...

  5. python爬取英雄联盟所有皮肤价格表_利用Python协程来爬取LOL所有英雄的皮肤高清图片...

    最近有一朋友要LOL的数据进行数据分析,叫我帮他抓一下数据.突发奇想,顺便把英雄的所有皮肤下载到本地好了. PS: 安装了LOL的伙伴图片直接在LOL文件夹里面,可以百度寻找.此贴仅分享下技术思路以及 ...

  6. python爬取英雄联盟所有皮肤价格表_实用Python是如何爬取英雄联盟(lol)所有皮肤,涨知识了...

    小三:"怎么了小二?一副无精打彩的样子!"html 小二:"唉!别提了,还不是最近又接触了一个叫英雄联盟的游戏,游戏中不少皮肤都须要花钱买,可是我钱不够呀..." ...

  7. python爬取英雄联盟所有皮肤价格表_实用Python是如何爬取英雄联盟(lol)全部皮肤,涨知识了...

    小三:"怎么了小二?一副无精打采的样子!" 小二:"唉!别提了,还不是最近又接触了一个叫英雄联盟的游戏,游戏中很多皮肤都需要花钱买,但是我钱不够呀..." 小三 ...

  8. python爬取英雄联盟所有皮肤_用Python爬取英雄联盟(lol)全部皮肤

    小三:"怎么了小二?一副无精打采的样子!" 小二:"唉!别提了,还不是最近又接触了一个叫英雄联盟的游戏,游戏中很多皮肤都需要花钱买,但是我钱不够呀..." 小三 ...

  9. python爬取英雄联盟所有皮肤价格表_用Python爬取英雄联盟(lol)全部皮肤

    小三:"怎么了小二?一副无精打采的样子!" 小二:"唉!别提了,还不是最近又接触了一个叫英雄联盟的游戏,游戏中很多皮肤都需要花钱买,但是我钱不够呀..." 小三 ...

  10. 我用Python爬取英雄联盟的皮肤,隔壁家的小弟弟都馋哭了

    一.推理原理 1.先去<英雄联盟>官网找到英雄及皮肤图片的网址: lol.qq.com/data/info-h- 2.从上面网址可以看到所有英雄都在,按下F12查看源代码,发现英雄及皮肤图 ...

最新文章

  1. 中文版!学习TensorFlow、PyTorch、机器学习、深度学习和数据结构五件套!(附免费下载)...
  2. 在cxf中使用配置避免增加字段导致客户端必须更新、同步实体属性的问题
  3. 使用Tensorflow操作MNIST数据
  4. 从人生,从马克思主义哲学角度对于软件设计的思考20090824
  5. 关于如何升级gcc版本及相关的标准库问题
  6. .NET HttpGet 获取服务器文件下的图片信息 同步和异步方式处理
  7. Fedora32升级Fedora33后无线网络无法连接的问题
  8. matlab语句跳转,matlab编程 跳转语句
  9. python调试教程_python进阶教程之==、is和调试
  10. 配置nginx+wordpress的https
  11. Unix操作系统的原理、优点与缺点
  12. HTML与CSS面试题汇总
  13. 软件测试职业目标具体计划范文,关于测试的工作计划
  14. HDU--2015-TO-2019--假期实在是太无聊了....
  15. 2018年北京AQI全年走势图
  16. 亚马逊云科技在中国市场火了?真相令人想不到
  17. 四川大学2019计算机考研,四川大学考研全攻略篇(各学院2019年考研详解、报考建议...)...
  18. GitChat·DevOps | 如何结合 Scrum 和 Kanban
  19. ImageMagick将多张图片拼接成一张图片_word转存技巧:如何将每页文档转换为图片保存?...
  20. PS轻松制作GIF动态图

热门文章

  1. 罗技G500游戏鼠标
  2. 微信整人假红包图片_整人的微信红包玩法!微信红包图片整人!
  3. 旋转式光电编码器的设计动向
  4. css 链接设计,css将超链接a设计成按钮样式实例
  5. 加密解密之 crypto-js 知识
  6. MeScroll 移动端刷新,分页
  7. Globle Get 多线程下载系统
  8. HMC5883L 磁力计校准
  9. 2.8 转置矩阵及对称矩阵
  10. 华为USG6000v防火墙双机热备综合实验