当前位置: 首页 > 后端技术 > Python

Python爬虫获取王者荣耀英雄图片

时间:2023-03-26 16:13:12 Python

这两天无所事事。正好有个小辈在学python,想爬王者皮肤图,就给了我相关的url,我帮忙写了一个简单的脚本。分享给大家使用。相关网址这个爬虫需要两个网址。保存英雄信息的json文件:https://pvp.qq.com/web201605/js/herolist.json看起来是这样的,应该一目了然:[{"ename":105,"cname":"廉颇","title":"正义引爆","new_type":0,"hero_type":3,"skin_name":"正义引爆|地狱石魂"},{"ename":106,"cname":"小小Joe","title":"爱情微风","new_type":0,"hero_type":2,"skin_name":"爱情微风|万圣节|天鹅之梦|纯白姻缘|七彩独角兽"},{"ename":107,"cname":"赵云","title":"天龙","new_type":0,"hero_type":1,"hero_type2":4,"skin_name":"苍天翔龙|忍炎影|未来时代|海军上将|嘻哈天王|白执事|引擎之心》}......英雄图片获取地址:https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{英雄编号}/{英雄编号}-bigskin-{皮肤编号}.jpg这是什么意思?我们以小乔为例。上面的json中,小乔的ename是106,这里是英雄编号,皮肤编号从1开始。json中有5个皮肤,所以皮肤编号可以是1-5。比如https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/106/106-bigskin-1.jpg就是小乔的原版皮肤。编码实现通过观察JSON文件可以发现,它以对象数组的形式存在,数组中的值是一个存储英雄信息的对象。如果我们要获取指定英雄的皮肤,那么我们必须搜索英雄的名字[ename],得到它的序号[cname]和皮肤名称列表[skin_name],因为[skin_name]是和“|”,所以我们需要对字符串进行拆分,统计有多少个皮肤,得到对应的皮肤编号,然后填入url模板。同时我们还可以将英雄名称和皮肤名称连接起来作为下载图片的名称,方便管理。效果如图:具体代码:importrequestsimportosdefsave_IMG(hero_id,hero_name,skin_names,path):#保存到指定目录,如果没有则创建os.path.exists(path):os.mkdir(path)ifnotos.path.exists(path+"/"+hero_name):os.mkdir(path+"/"+hero_name)#skin_names为皮肤名称列表,获取其长度,然后遍历获取其下标为iinrange(len(skin_names)):#获取皮肤url格式如下img_url="https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/"+\str(hero_id)+"/"+str(hero_id)+\"-bigskin-"+str(i+1)+".jpg"#发送请求。当status_code为200时,表示服务器已成功处理请求。response=requests.get(img_url)ifresponse.status_code==200:#保存在指定文件中,自定义图片名称:英雄名称-皮肤编号-皮肤名称withopen(path+'/'+hero_name+"/"+hero_name+"-"+str(i+1)+"-"+skin_names[i]+'.jpg','wb')asf:f.write(response.content)if__name__=="__main__":#首先获取保存英雄信息的json文件url="https://pvp.qq.com/web201605/js/herolist.json"header={"User-Agent":"Mozilla/5.0(X11;Linuxx86_64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/73.0.3683.86Safari/537.36"}response=requests.get(url,headers=header)hero_list=response.json()#后续拼接url和下载需要英雄的编号、名称、皮肤名称name=input("请输入要抓取的英雄名称:")forhero_dicinhero_list:hero_id=hero_dic["ename"]hero_name=hero_dic["cname"]skin_names=hero_dic["skin_name"].split("|")#拆分出皮肤名称#如果要爬取所有英雄的皮肤,不需要判断,直接遍历列表即可ifhero_name==name:save_IMG(hero_id,hero_name,skin_names,"./skin")#自定义保存图片的文件夹break使用方法:python.\getSkin.py请输入要抓取的英雄名称:后羿会自动生成对应的文件夹输入,保存皮肤下载到这个文件夹下,如果想一次爬取所有皮肤,按照代码注释,去掉名字的判断,遍历整个列表即可。