python简单实现抓取英雄联盟皮肤原画:老玩家都哭了!

news/2024/11/29 8:57:18/

写在前面: 自学py已经快两个多月了吧,作为新手,就是敢于尝试,之前有看到有人抓取王者荣耀皮肤的,但是作为一个联盟老玩家,还是想搞一个抓取联盟皮肤的,下面分享一下我自己的学习经过,如果有错误或者建议,欢迎下面留言提出。

进入官网

抓取的网站如下:
英雄联盟资料库

然后我们通过开发者模式F12 ,可以看到箭头指向的一个文件
如果没看到的话,刷新一下页面就出来了

 url0="https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js"try:r=requests.get(url0)r.raise_for_status()r.encoding=r.apparent_encodingherolist=r.json()  #转换为josn格式except:print("爬取失败:")

然后我试着请求一下len(herolist),结果返回一个4,这就很纳闷了,按道理应该是147位英雄吧,接着直接打印出来herolist
这里只是截取部分打印信息:

{'hero': [{'heroId': '1', 'name': '黑暗之女', 'alias': 'Annie', 'title': '安妮', 'roles': 

现在就很清楚了,他是写在了"hero"里面,然后稍微修改了一下
代码如下

def getjosn():url0="https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js"try:r=requests.get(url0)r.raise_for_status()r.encoding=r.apparent_encodingherolist=r.json()  #转换为josn格式except:print("爬取失败:")print(herolist)herolists=herolist["hero"]    #获得hero对应的字典类型heronumber=list(map(lambda x:x["heroId"],herolists))  #获得英雄的编号列表heroname=list(map(lambda x:x["name"],herolists))   #获得英雄的名称列表return heroname,heronumber

通过这一步我们可以获得英雄的编号和名字,居然发现安妮是作为NO.1
果然亲女儿还是亲女儿!

接下来我们进入到皮肤原画的网址:

这里可以看到一个安妮的原画网址吧 高亮度显示的
但是这里要小心,不要用鼠标指向那个小安妮,那是获得窗口头像的,我们不要

安妮原画
https://game.gtimg.cn/images/lol/act/img/skin/big1000.jpg
然后看看安妮的第一个皮肤吧。
安妮第一个皮肤
https://game.gtimg.cn/images/lol/act/img/skin/big1001.jpg
对比这个二个皮肤网址就很容易发现区别了,就是后面从0到1,那我们试想第二个皮肤是不是从1到2呢,我们试了一下,结果是对的,依此类推,我们就可以获得安妮的所有皮肤了。
试着查看第二位英雄奥拉夫。
https://game.gtimg.cn/images/lol/act/img/skin/big2000.jpg
第三位呢?
https://game.gtimg.cn/images/lol/act/img/skin/big3000.jpg
我们得到规律,末尾的四位数,后三位是皮肤编号,前面一位以上的数字,可能就是英雄编号,那我们现在是不是得想起函数getjosn()返回的值呢?是不是可以很好的利用上去,完成我们的功能,我很高兴的去做了,结果并没有成功写入图片,原因是拼接图片的网址错了

之前我是直接拼接path,结果末尾四位居然出现了10,11,12这类问题
后面加入了一个strs()函数得到修改

path="https://game.gtimg.cn/images/lol/act/img/skin/big"+str(j)+str(k)+".jpg"

修改之后的代码:

def down():name,number=getjosn()   #获得name 和 编号   第一个黑暗之女   001    第二个狂战士 002i=0   #计数if not os.path.exists("D://英雄联盟壁纸//"):   #判断英雄联盟壁纸这个目录是否存在os.mkdir("D://英雄联盟壁纸//")    #创建这个目录for j in number:  #遍历每个编号if not os.path.exists("D://英雄联盟壁纸//"+name[i]):   #判断这个英雄文件夹是否存在os.mkdir("D://英雄联盟壁纸//"+name[i])   #创建这个英雄文件夹os.chdir("D://英雄联盟壁纸//"+name[i])  #进入这个文件夹i+=1for k in range(20):  #假设有20个皮肤path="https://game.gtimg.cn/images/lol/act/img/skin/big"+str(j)+str(strs(k))+".jpg"print(path)rr=requests.get(path)if rr.status_code==200: #请求正常with open(str(k)+".jpg","wb") as f:  #写入文件f.write(rr.content)f.close()print("{}的原壁纸已经下载了{}张\r".format(name[i-1],k))

其实这个程序到这里已经完成了,但是知识无极限,我还利用了空闲时间,让它实现了其他功能,现在附上全部代码:

# 编号 英雄 列表 url=https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js
import  requests
import  os
from  PIL  import  Image
import  timedef getjosn():url0="https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js"try:r=requests.get(url0)r.raise_for_status()r.encoding=r.apparent_encodingherolist=r.json()  #转换为josn格式except:print("爬取失败:")print(herolist)herolists=herolist["hero"]    #获得hero对应的字典类型heronumber=list(map(lambda x:x["heroId"],herolists))  #获得英雄的编号列表heroname=list(map(lambda x:x["name"],herolists))   #获得英雄的名称列表return heroname,heronumber
def strs(k):if k>=0 and k<10:return "00"+str(k)else:return "0"+str(k)
def down():name,number=getjosn()   #获得name 和 编号   第一个黑暗之女   001    第二个狂战士 002i=0   #计数if not os.path.exists("D://英雄联盟壁纸//"):   #判断英雄联盟壁纸这个目录是否存在os.mkdir("D://英雄联盟壁纸//")    #创建这个目录for j in number:  #遍历每个编号if not os.path.exists("D://英雄联盟壁纸//"+name[i]):   #判断这个英雄文件夹是否存在os.mkdir("D://英雄联盟壁纸//"+name[i])   #创建这个英雄文件夹os.chdir("D://英雄联盟壁纸//"+name[i])  #进入这个文件夹i+=1for k in range(20):  #假设有20个皮肤path="https://game.gtimg.cn/images/lol/act/img/skin/big"+str(j)+str(strs(k))+".jpg"print(path)rr=requests.get(path)if rr.status_code==200: #请求正常with open(str(k)+".jpg","wb") as f:  #写入文件f.write(rr.content)f.close()print("{}的原壁纸已经下载了{}张\r".format(name[i-1],k))
def look():hero=input("欢迎查询英雄皮肤,请选择你要查询的英雄:")m="D://英雄联盟壁纸//"+str(hero)if not os.path.exists(m):   #判断改英雄皮肤是否已经下载ys=input("很抱歉,这个英雄的壁纸暂时未下载,是否调入下载功能yes/no:")if ys=="yes":print("正在全部下载中:")down()else:print("请重新输入英雄:")look()for i in range(20):  #查看此英雄的所有皮肤壁画image=Image.open(m+"//"+str(i)+".jpg")image.show()time.sleep(1)def main():print("该程序已经下载了部分英雄原壁纸(下载全部壁纸耗时且占用内存)")n=input("1、继续下载:/2、选择浏览:")if n=="1":down()else:look()
main()

这是大学生活中第一次写这个博客,好多东西不咋会,别喷我。对于这个代码来说,美中不足的是,我还没找到如何实现下载指定英雄的办法,这也是一个败笔 ,阅读代码如果有问题,或者有错误的话欢迎留言。


http://www.ppmy.cn/news/479620.html

相关文章

Java Swing 皮肤

本文将深入透视 Synth 外观&#xff0c;他是 java 5.0 中为 Swing 引入的最新内容。通过为 Java UI 编程引入“皮肤”的概念&#xff0c;Synth 使研发人员能够为应用程式创建和部署定制的外观。软件工程师 Michael Abernethy 将带您从头开始逐步构建一个具备 synth 外观的应用程…

svn修改ip windows_svn服务地址怎么更换成ip - 卡饭网

yy歪歪语音为什么娱乐套件4.1会更换成娱乐套件mini版? yy歪歪语音为什么娱乐套件4.1会更换成娱乐套件mini版? (6月18日)开始&#xff0c;除星级公会和直播间会使用原版娱乐套件(即娱乐套件4.1)&#xff0c;其它已经添加过娱乐套件4.1的频道会更换成娱乐套件mini版&#xff0c…

美化你的ubuntu18.04

文章目录 美化Ubuntu18.04ubuntu Tweaks安装Tweaks使用Tweaks 更换ubuntu主题安装Adapta设置Adapta 更换文件夹图标主题GNOME-ExtensionsDash to dockUser themesGravatar 更换登陆界面效果图参考链接 美化Ubuntu18.04 刚下载好的ubuntu主题比较丑陋&#xff0c;应用图标、左边…

虚幻4皮肤材质_虚幻引擎4.5版本预览说明

即将到来的4.5版本包含了大家翘首以待的新功能&#xff0c;包括了动画重定向、自动C热重载、光照贴图UV生成以及动态载入视频贴图。 新的实时光线追踪的柔和阴影让您可以创建具有绚丽光照的动态场景&#xff0c;并且屏幕空间的次表面散射令异常真实的皮肤材质成为可能。 最后&a…

AlphaControls 控件 TsFrameBar 创建下拉式多级导航菜单

AlphaControls 控件 TsFrameBar 创建下拉式多级导航菜单 TsFrameBar控件是创建一个下拉菜单的工具块。 TsFrameBar控件本身&#xff0c;可以通过创建TITEMS&#xff0c;自身的框架中&#xff0c;创建所需若干按键&#xff0c;组成按键式工具条&#xff0c;形成一级菜单。 每…

AlphaControls TsAlphaHints 控件

AlphaControls TsAlphaHints 控件 一、功能 TsAlphaHints控制应用程序中工具提示的绘制&#xff0c;带或不带皮肤。为了让这个组件工作&#xff0c;将他放在应用程序的主要形式中就足够了。他已经有一种基本样式&#xff0c;此样式已配置并作为默认样式使用。就这样&#…

AlphaControls TsSkinManager 控件

TsSkinManager 该组件设计用于集中管理程序换肤过程。对于这个组件的工作&#xff0c;定义一个使用过的皮肤并将 Active 属性设置为 True 就足够了。 一、皮肤与应用程序一起部署的方式&#xff1a; 1、将皮肤添加到 InternalSkins 列表中&#xff0c;我们称它们为“内部”…

Winform:自定义滚动条——可自定义皮肤

最近做了一个可自定义皮肤的滚动条&#xff0c; 直接上效果图&#xff1a; 其中ScrollStyle属性中内置了3中样式和可自定义皮肤的样式&#xff08;Custom&#xff09;&#xff1a; 下面为三种内置样式的效果图&#xff1a; 下面是选择Custom样式后自定义皮肤&#xff1a; 只要…