出品: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}.jpg1 开始依次递增,再来看看不同英雄的皮肤图片 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 获取英雄皮肤壁纸相关推荐

  1. 荣耀v10玩flash游戏_沫子玩王者荣耀被打哭?直言这个游戏比吃鸡还难玩

    对于经常玩<绝地求生>的小伙伴,说起吃鸡一姐沫子相信不少人都会有所耳闻,职业选手出身的沫子,操作在很多技术主播中都是相当排前的,再加上有一颗大大咧咧的心脏,直播间内也是不缺乏欢声笑语.然而 ...

  2. 学计算机可以玩王者吗,很简单!教你用电脑玩王者荣耀的方法

    原标题:很简单!教你用电脑玩王者荣耀的方法 你是不是都是在手机上玩王者荣耀? 你知道吗,电脑上也可以玩 手机毕竟不如电脑操作更方便 教给你用电脑玩王者荣耀的技巧 不怕卡顿断网,畅玩王者荣耀 王者荣耀火 ...

  3. [转载] 为研究网络游戏成瘾 我陪儿子玩王者荣耀

    转载来源:https://news.baidu.com/news#/detail/8640583719318022365 出品 | 新浪科技<科学大家> 撰文 | 雷皓 中国科学院武汉物理 ...

  4. java游戏为什么_手机Java游戏老玩家:为什么我开始了玩王者荣耀?

    原标题:手机Java游戏老玩家:为什么我开始了玩王者荣耀? 王者看阿泽,荣耀来开黑!大家好,我是助手君阿泽~! 一位手机Java游戏老玩家:为什么,我开始了玩王者荣耀? 其实,大部分的手游,我是不喜欢 ...

  5. 轩辕剑java版怎么玩_手机Java游戏老玩家:为什么我开始了玩王者荣耀?

    王者看阿泽,荣耀来开黑!大家好,我是助手君阿泽~! 一位手机Java游戏老玩家:为什么,我开始了玩王者荣耀? 其实,大部分的手游,我是不喜欢玩的,尤其是近几年的,比如<阴阳师>,<梦 ...

  6. 王者荣耀服务器维护中可是别人能玩,王者荣耀在玩时候被别人登了怎么办 | 手游网游页游攻略大全...

    发布时间:2015-10-22 王者荣耀游戏里,孙悟空是一名有着高输出的战士型英雄.那么,孙悟空在对战时有哪些小技巧呢?下面为大家带来王者荣耀孙悟空玩法技巧. 悟空的主动伤害技能其实仅仅只有一个3技能 ...

  7. iphonex适配游戏_iPhoneX怎么玩王者荣耀 iPhoneX适配常见问题汇总

    iPhoneX怎么玩王者荣耀?官方在2017年11月8日上架了1.31.4.18客户端版本以优化iPhone X机型的游戏体验,各位iPhone X召唤师需要将APP版本号升级为1.31.4.18即可 ...

  8. iphonex适配游戏_王者荣耀iphoneX适配版本问题大全 iphoneX玩王者荣耀常见问题

    iphoneX玩王者荣耀的适配问题已经得到官方的解决,不过也有玩家发现了除了黑框以外的其他问题,比如说两侧有黑边,两侧模糊看不清楚等.其实官方在最新版本的补丁中已经做了相关说明,一起来看看具体的问题解 ...

  9. 华为android9王者荣耀卡,华为mate9玩王者荣耀怎么样 mate9玩王者荣耀卡吗

    华为mate9玩王者荣耀怎么样?mate9玩王者荣耀卡吗?mate9是基于安卓7.0再开发的手机系统,很多小伙伴似乎不知道华为mate9玩王者荣耀断触怎么办,小编今天就带来了华为mate9玩王者荣耀优 ...

最新文章

  1. BigDecimal divide方法结果为无限小数问题
  2. python基础教程:ord()和chr()
  3. maven 工程依赖了某个jar包 但还是报java.lang.ClassNotFoundException的问题
  4. java 手写阻塞队列_Java阻塞队列的实现
  5. 【牛客 - 210A】游戏(思维,脑洞)
  6. NO.34 关于禅道加密
  7. java bank项目答案_Bank项目-java
  8. PHP:打造一个无限极评论模块
  9. ubuntu下不同版本python默认切换
  10. Python报错 SyntaxError: invalid syntax
  11. 机器视觉技术概述-技术难点-市场前景
  12. Github中文汉化插件—英语渣渣的福利(转)
  13. Element UI的数据表格数据检索方法
  14. SQL数据库快照删除
  15. js template换行_D3.js实现文本的换行详解
  16. 两种ps切图方法(图层/切片)
  17. Simscape物理网络建模的基本原理
  18. 纯前端解码、播放、录音、编码 AMR 音频,无须服务器支持
  19. python实现网站测速软件_网站测速插件是什么-和网站测速插件相关的问题-阿里云开发者社区...
  20. 加拿大数字知名媒体Digital Journal全面报道Filenet项目

热门文章

  1. 周志华《机器学习》第八章复习(带例题)
  2. [SAP - HCM] 白话版SAP HR
  3. python分治算法_黄哥Python:分治算法(Divide-and-Conquer)
  4. 海伊视讯M91A布控球接入国标28181平台添加设备操作步骤
  5. zabbix 自定义监控文本内容
  6. 【AI产品】拥有它,一秒成为艺术家,你还在等什么?
  7. mybatis的一级缓存、二级缓存、sqlsession、sqlsessionfactory什么意思?
  8. CNC加工中心操作经验汇集,这次总结全了!
  9. 三星a9s参数_四摄镜头来了!三星Galaxy A9s参数曝光
  10. WinPcap编程【1】--编程环境的设置