喜欢玩王者荣耀的有福了,用 Python 获取英雄皮肤壁纸
出品:Python数据之道 (ID:PyDataLab)
作者:叶庭云,来自读者投稿
编辑:Lemon
一、前言
王者荣耀这款手游,想必大家都玩过或听过,游戏里英雄有各式各样的皮肤,制作得很精美,有些拿来做电脑壁纸它不香吗。本文带你利用 Python 爬虫一键下载王者荣耀英雄皮肤壁纸。
1. 目标
创建一个文件夹, 里面又有按英雄名称分的子文件夹保存该英雄的所有皮肤图片。
URL:https://pvp.qq.com/web201605/herolist.shtml
2. 环境
运行环境:Pycharm、Python3.7
需要的库
import requests
import os
import json
from lxml import etree
from fake_useragent import UserAgent
import logging
二、分析网页
首先打开王者荣耀官网,点击英雄资料进去。
进入新的页面后,任意选择一个英雄,检查网页。
多选择几个英雄检查网页,可以发现各个英雄页面的 URL 规律
https://pvp.qq.com/web201605/herodetail/152.shtml
https://pvp.qq.com/web201605/herodetail/150.shtml
https://pvp.qq.com/web201605/herodetail/167.shtml
发现只有末尾的数字在变化,末尾的数字可以认为是该英雄的页面标识。
点击 Network,Crtl + R 刷新,可以找到一个 herolist.json 文件。
发现是乱码,但问题不大,双击这个 json 文件,将它下载下来观察,用编辑器打开可以看到。
ename 是英雄网址页面的标识;而 cname 是对应英雄的名称;skin_name 为对应皮肤的名称。
任选一个英雄页面进去,检查该英雄下面所有皮肤,观察 url 变化规律。
url变化规律如下:
https://game.gtimg.cn/images/yxzj/img201606/heroimg/152/152-bigskin-1.jpg
https://game.gtimg.cn/images/yxzj/img201606/heroimg/152/152-bigskin-2.jpg
https://game.gtimg.cn/images/yxzj/img201606/heroimg/152/152-bigskin-3.jpg
https://game.gtimg.cn/images/yxzj/img201606/heroimg/152/152-bigskin-4.jpg
https://game.gtimg.cn/images/yxzj/img201606/heroimg/152/152-bigskin-5.jpg
复制图片链接到浏览器打开,可以看到高清大图。
观察到同一个英雄的皮肤图片 url 末尾 -{x}.jpg
从 1
开始依次递增,再来看看不同英雄的皮肤图片 url 是如何构造的。会发现, ename 这个英雄的标识不一样,获取到的图片就不一样,由 ename 参数决定。
https://game.gtimg.cn/images/yxzj/img201606/heroimg/152/152-bigskin-1.jpg
https://game.gtimg.cn/images/yxzj/img201606/heroimg/150/150-bigskin-1.jpg
https://game.gtimg.cn/images/yxzj/img201606/heroimg/153/153-bigskin-1.jpg
# 可构造图片请求链接如下
https://game.gtimg.cn/images/yxzj/img201606/heroimg/{ename}/{ename}-bigskin-{x}.jpg
三、爬虫代码实现
# -*- coding: UTF-8 -*-
"""
@File :王者荣耀英雄皮肤壁纸.py
@Author :叶庭云
@Date :2020/10/2 11:40
@CSDN :https://blog.csdn.net/fyfugoyfa
"""
import requests
import os
import json
from lxml import etree
from fake_useragent import UserAgent
import logging# 日志输出的基本配置
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')class glory_of_king(object):def __init__(self):if not os.path.exists("./王者荣耀皮肤"):os.mkdir("王者荣耀皮肤")# 利用fake_useragent产生随机UserAgent 防止被反爬ua = UserAgent(verify_ssl=False, path='fake_useragent.json')for i in range(1, 50):self.headers = {'User-Agent': ua.random}def scrape_skin(self):# 发送请求 获取响应response = requests.get('https://pvp.qq.com/web201605/js/herolist.json', headers=self.headers)# str转为jsondata = json.loads(response.text)# for循环遍历data获取需要的字段 创建对应英雄名称的文件夹for i in data:hero_number = i['ename'] # 获取英雄名字编号hero_name = i['cname'] # 获取英雄名字os.mkdir("./王者荣耀皮肤/{}".format(hero_name)) # 创建英雄名称对应的文件夹response_src = requests.get("https://pvp.qq.com/web201605/herodetail/{}.shtml".format(hero_number),headers=self.headers)hero_content = response_src.content.decode('gbk') # 返回相应的html页面 解码为gbk# xpath解析对象 提取每个英雄的皮肤名字hero_data = etree.HTML(hero_content)hero_img = hero_data.xpath('//div[@class="pic-pf"]/ul/@data-imgname')# 去掉每个皮肤名字中间的分隔符hero_src = hero_img[0].split('|')logging.info(hero_src)# 遍历英雄src处理图片名称。for j in range(len(hero_src)):# 去掉皮肤名字的&符号index_ = hero_src[j].find("&")skin_name = hero_src[j][:index_]# 请求下载图片response_skin = requests.get("https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{}/{}-bigskin-{}.jpg".format(hero_number, hero_number, j + 1))# 获取图片二进制数据 skin_img = response_skin.content # 把皮肤图片保存到对应名字的文件里with open("./王者荣耀皮肤/{}/{}.jpg".format(hero_name, skin_name), "wb")as f:f.write(skin_img)logging.info(f"{skin_name}.jpg 下载成功!!")def run(self):self.scrape_skin()if __name__ == '__main__':spider = glory_of_king()spider.run()
运行效果如下:
程序运行一段时间,英雄皮肤壁纸就都保存在本地文件夹啦,结果如下:
四、其他说明
不建议抓取太多数据,容易对服务器造成负载,浅尝辄止即可。
通过本文爬虫,可以帮助你了解 json 数据的解析和提取需要的数据,如何通过字符串的拼接来构造URL请求。
本文利用 Python 爬虫一键下载王者荣耀英雄皮肤壁纸,实现过程中也会遇到一些问题,多思考和调试,最终解决问题,也能理解得更深刻。
代码可直接复制运行,如果觉得还不错,记得给个赞哦,也是对作者最大的鼓励,不足之处可以在评论区多多指正。
解决报错:fake_useragent.errors.FakeUserAgentError: Maximum amount of retries reached
# 报错如下
Error occurred during loading data. Trying to use cache server https://fake-useragent.herokuapp.com/browsers/0.1.11
Traceback (most recent call last):File "/usr/local/python3/lib/python3.6/urllib/request.py", line 1318, in do_openencode_chunked=req.has_header('Transfer-encoding'))File "/usr/local/python3/lib/python3.6/http/client.py", line 1239, in requestself._send_request(method, url, body, headers, encode_chunked)File "/usr/local/python3/lib/python3.6/http/client.py", line 1285, in _send_requestself.endheaders(body, encode_chunked=encode_chunked)File "/usr/local/python3/lib/python3.6/http/client.py", line 1234, in endheadersself._send_output(message_body, encode_chunked=encode_chunked)File "/usr/local/python3/lib/python3.6/http/client.py", line 1026, in _send_outputself.send(msg)File "/usr/local/python3/lib/python3.6/http/client.py", line 964, in sendself.connect()File "/usr/local/python3/lib/python3.6/http/client.py", line 1392, in connectsuper().connect()File "/usr/local/python3/lib/python3.6/http/client.py", line 936, in connect(self.host,self.port), self.timeout, self.source_address)File "/usr/local/python3/lib/python3.6/socket.py", line 724, in create_connectionraise errFile "/usr/local/python3/lib/python3.6/socket.py", line 713, in create_connectionsock.connect(sa)
socket.timeout: timed outDuring handling of the above exception, another exception occurred:Traceback (most recent call last):File "/usr/local/python3/lib/python3.6/site-packages/fake_useragent/utils.py", line 67, in getcontext=context,File "/usr/local/python3/lib/python3.6/urllib/request.py", line 223, in urlopenreturn opener.open(url, data, timeout)File "/usr/local/python3/lib/python3.6/urllib/request.py", line 526, in openresponse = self._open(req, data)File "/usr/local/python3/lib/python3.6/urllib/request.py", line 544, in _open'_open', req)File "/usr/local/python3/lib/python3.6/urllib/request.py", line 504, in _call_chainresult = func(*args)File "/usr/local/python3/lib/python3.6/urllib/request.py", line 1361, in https_opencontext=self._context, check_hostname=self._check_hostname)File "/usr/local/python3/lib/python3.6/urllib/request.py", line 1320, in do_openraise URLError(err)
urllib.error.URLError: <urlopen error timed out>During handling of the above exception, another exception occurred:Traceback (most recent call last):File "/usr/local/python3/lib/python3.6/site-packages/fake_useragent/utils.py", line 154, in loadfor item in get_browsers(verify_ssl=verify_ssl):File "/usr/local/python3/lib/python3.6/site-packages/fake_useragent/utils.py", line 97, in get_browsershtml = get(settings.BROWSERS_STATS_PAGE, verify_ssl=verify_ssl)File "/usr/local/python3/lib/python3.6/site-packages/fake_useragent/utils.py", line 84, in getraise FakeUserAgentError('Maximum amount of retries reached')
fake_useragent.errors.FakeUserAgentError: Maximum amount of retries reached
解决方法如下:
# 将 https://fake-useragent.herokuapp.com/browsers/0.1.11 里内容复制 并另存为本地 json 文件:fake_useragent.json
# 引用
ua = UserAgent(verify_ssl=False, path='fake_useragent.json')
print(ua.random)运行结果如下:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1500.55 Safari/537.36
作者简介:
叶庭云
个人格言: 热爱可抵岁月漫长
CSDN博客: https://blog.csdn.net/fyfugoyfa/
---------End---------
关注后回复“w”,加我私人微信
????分享、点赞、在看,给个三连击呗!????
喜欢玩王者荣耀的有福了,用 Python 获取英雄皮肤壁纸相关推荐
- 荣耀v10玩flash游戏_沫子玩王者荣耀被打哭?直言这个游戏比吃鸡还难玩
对于经常玩<绝地求生>的小伙伴,说起吃鸡一姐沫子相信不少人都会有所耳闻,职业选手出身的沫子,操作在很多技术主播中都是相当排前的,再加上有一颗大大咧咧的心脏,直播间内也是不缺乏欢声笑语.然而 ...
- 学计算机可以玩王者吗,很简单!教你用电脑玩王者荣耀的方法
原标题:很简单!教你用电脑玩王者荣耀的方法 你是不是都是在手机上玩王者荣耀? 你知道吗,电脑上也可以玩 手机毕竟不如电脑操作更方便 教给你用电脑玩王者荣耀的技巧 不怕卡顿断网,畅玩王者荣耀 王者荣耀火 ...
- [转载] 为研究网络游戏成瘾 我陪儿子玩王者荣耀
转载来源:https://news.baidu.com/news#/detail/8640583719318022365 出品 | 新浪科技<科学大家> 撰文 | 雷皓 中国科学院武汉物理 ...
- java游戏为什么_手机Java游戏老玩家:为什么我开始了玩王者荣耀?
原标题:手机Java游戏老玩家:为什么我开始了玩王者荣耀? 王者看阿泽,荣耀来开黑!大家好,我是助手君阿泽~! 一位手机Java游戏老玩家:为什么,我开始了玩王者荣耀? 其实,大部分的手游,我是不喜欢 ...
- 轩辕剑java版怎么玩_手机Java游戏老玩家:为什么我开始了玩王者荣耀?
王者看阿泽,荣耀来开黑!大家好,我是助手君阿泽~! 一位手机Java游戏老玩家:为什么,我开始了玩王者荣耀? 其实,大部分的手游,我是不喜欢玩的,尤其是近几年的,比如<阴阳师>,<梦 ...
- 王者荣耀服务器维护中可是别人能玩,王者荣耀在玩时候被别人登了怎么办 | 手游网游页游攻略大全...
发布时间:2015-10-22 王者荣耀游戏里,孙悟空是一名有着高输出的战士型英雄.那么,孙悟空在对战时有哪些小技巧呢?下面为大家带来王者荣耀孙悟空玩法技巧. 悟空的主动伤害技能其实仅仅只有一个3技能 ...
- iphonex适配游戏_iPhoneX怎么玩王者荣耀 iPhoneX适配常见问题汇总
iPhoneX怎么玩王者荣耀?官方在2017年11月8日上架了1.31.4.18客户端版本以优化iPhone X机型的游戏体验,各位iPhone X召唤师需要将APP版本号升级为1.31.4.18即可 ...
- iphonex适配游戏_王者荣耀iphoneX适配版本问题大全 iphoneX玩王者荣耀常见问题
iphoneX玩王者荣耀的适配问题已经得到官方的解决,不过也有玩家发现了除了黑框以外的其他问题,比如说两侧有黑边,两侧模糊看不清楚等.其实官方在最新版本的补丁中已经做了相关说明,一起来看看具体的问题解 ...
- 华为android9王者荣耀卡,华为mate9玩王者荣耀怎么样 mate9玩王者荣耀卡吗
华为mate9玩王者荣耀怎么样?mate9玩王者荣耀卡吗?mate9是基于安卓7.0再开发的手机系统,很多小伙伴似乎不知道华为mate9玩王者荣耀断触怎么办,小编今天就带来了华为mate9玩王者荣耀优 ...
最新文章
- BigDecimal divide方法结果为无限小数问题
- python基础教程:ord()和chr()
- maven 工程依赖了某个jar包 但还是报java.lang.ClassNotFoundException的问题
- java 手写阻塞队列_Java阻塞队列的实现
- 【牛客 - 210A】游戏(思维,脑洞)
- NO.34 关于禅道加密
- java bank项目答案_Bank项目-java
- PHP:打造一个无限极评论模块
- ubuntu下不同版本python默认切换
- Python报错 SyntaxError: invalid syntax
- 机器视觉技术概述-技术难点-市场前景
- Github中文汉化插件—英语渣渣的福利(转)
- Element UI的数据表格数据检索方法
- SQL数据库快照删除
- js template换行_D3.js实现文本的换行详解
- 两种ps切图方法(图层/切片)
- Simscape物理网络建模的基本原理
- 纯前端解码、播放、录音、编码 AMR 音频,无须服务器支持
- python实现网站测速软件_网站测速插件是什么-和网站测速插件相关的问题-阿里云开发者社区...
- 加拿大数字知名媒体Digital Journal全面报道Filenet项目
热门文章
- 周志华《机器学习》第八章复习(带例题)
- [SAP - HCM] 白话版SAP HR
- python分治算法_黄哥Python:分治算法(Divide-and-Conquer)
- 海伊视讯M91A布控球接入国标28181平台添加设备操作步骤
- zabbix 自定义监控文本内容
- 【AI产品】拥有它,一秒成为艺术家,你还在等什么?
- mybatis的一级缓存、二级缓存、sqlsession、sqlsessionfactory什么意思?
- CNC加工中心操作经验汇集,这次总结全了!
- 三星a9s参数_四摄镜头来了!三星Galaxy A9s参数曝光
- WinPcap编程【1】--编程环境的设置