|
“ 大家好,在平常的学习和工作中,我们难免需要去爬取一些数据。今天,我给大家带来一个有趣的项目:使用 Python 爬取王者荣耀全部英雄的皮肤图片。
我们都知道,王者荣耀拥有众多各具特色的英雄和华丽多彩的皮肤。我们可以利用 Python 的强大功能,轻松爬取王者荣耀官网的英雄皮肤图片。下面就让我来详细介绍一下如何实现这个项目吧!
1 关于Python
Python是一种流行的高级编程语言,被广泛应用于数据分析、人工智能、Web开发等领域。Python的易读性和可扩展性使其成为新手和专业人士的首选编程语言之一。
如果你还不了解Python的话,我推荐你先学习Python的基础知识。 以下是一些关于Python语言介绍和安装教程的参考资料:
- Python基础教程https://www.runoob.com/python/python-tutorial.html: 该网站提供了Python语言的基础知识教程,从Python的安装、变量、数据类型、循环、函数等基本概念讲起,逐渐深入介绍Python的高级特性,如面向对象编程和异常处理等。教程简单易懂,适合新手入门的合法链接。
- Python官方文档https://docs.python.org/zh-tw/3.8/using/index.html:官方文档提供了Python的详细介绍和使用说明,包括Python的安装、环境设置、调用解释器等方面的信息,同时还提供了Python标准库和第三方库的详细文档和使用方法。
- Python安装教程https://zhuanlan.zhihu.com/p/104502997:该教程提供了Python在Windows和MacOS平台上的安装教程,教程详细说明了Python的安装步骤和配置,同时还介绍了Python的一些常用IDE,如PyCharm、Jupyter Notebook等
以上内容在此不赘述,关于python安装和库的安装导入欢迎交流,有需要小编会出一版详细的教程~~
2 如何用Python爬取
2.1 爬虫思路简介
从王者荣耀官方网站,通过查看源代码找到网页中包含英雄信息的JSON文件。首先从JSON文件中读取英雄信息,然后遍历每个英雄并创建英雄网页链接。接着,通过获取英雄网页内容并解析HTML,找到英雄的所有皮肤名称,然后保存每个皮肤的图片到本地。下载过程中,代码会每隔1秒钟暂停一次,以防止因频繁访问网站而被网站封禁。
2.2 详细步骤及代码
1. 环境准备
首先,我们需要安装一些必要的 Python 库,比如 requests、lxml 等。这些库可以通过 pip 来进行安装,具体操作方法可自行搜索。 以下是代码中用到的 Python 库和函数的详细介绍和解释:
- requests 库:用于向网页发送 HTTP 请求和获取 HTTP 响应的 Python 库。可以使用它来发送 GET、POST 等请求,并获取响应的内容、状态码、请求头等信息。
- requests.get(url, headers=headers):向指定的 url 发送 GET 请求,并指定请求头为 headers,返回响应对象。
- lxml 库:基于 libxml2 和 libxslt 库的 Python 库,用于解析 HTML 和 XML 文档。它提供了 XPath 和 CSS 选择器等方式来提取和操作文档中的数据。
- html.etree:lxml 库中的 etree 模块,提供了 HTML 和 XML 解析器的类和方法。
- html.etree.HTML(html_text):将 html_text 字符串解析为 HTML 树,返回一个根节点对象。
- e.xpath(xpath_expr):使用 XPath 表达式 xpath_expr 从 HTML 树中提取数据,返回一个列表。
- json 库:用于处理 JSON 数据格式的 Python 标准库,提供了从 Python 对象到 JSON 格式的转换和从 JSON 格式到 Python 对象的转换方法。
- json.load(f):从文件对象 f 中读取 JSON 数据,并将其转换为 Python 对象。
- os 库:提供了操作系统相关的功能的 Python 标准库。它提供了与文件和目录操作相关的功能,如创建、删除、移动文件和目录等。
- os.makedirs(path):递归创建目录,即使父目录不存在也可以创建。
- time 库:提供了与时间相关的函数的 Python 标准库。它提供了获取当前时间、等待一定时间等功能。
- time.sleep(seconds):暂停执行当前线程指定的时间,单位为秒
2.准备工作
我们需要先获取王者荣耀英雄的编号和其他信息。在本项目中,我已经将这些信息保存在了一个名为 herolist.json 的 JSON 文件中。这个文件包含了每个英雄的编号、中文名、称号、英雄类型、皮肤名和 ID 等信息。我们需要在代码中导入 json 库,使用 load() 函数将这个 JSON 文件读入并解析。
3.爬取皮肤图片
接下来,我们需要遍历所有英雄,获取每个英雄的皮肤图片。我们可以通过 requests 库来发送请求,获取网页内容。然后,我们使用 lxml 库中的 etree.HTML() 函数来解析 HTML 页面,提取我们需要的皮肤图片链接。
最后,我们使用 requests 库中的 get() 函数来下载这些图片。注意,为了不给服务器带来太大的压力,我们需要设置一定的时间间隔。代码中我使用了 time 库的 sleep() 函数来实现。
最终的代码如下所示:(代码中已加上详细注释):
# 导入所需要的库
import requests # 发送HTTP请求
from lxml import html # 解析HTML
import json # 处理JSON数据
import os # 与操作系统进行交互,比如创建文件夹
import time # 处理时间相关操作
# 读取JSON文件,包含英雄的信息
with open('herolist.json') as f:
heros = json.load(f)
# 遍历所有英雄,获取其网页内容和皮肤信息
for hero in heros:
# 获取单个英雄的网页内容
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
} # 请求头信息,用于模拟浏览器行为
url = f"https://pvp.qq.com/web201605/herodetail/{hero['ename']}.shtml" # 单个英雄的网页链接
hero_resp = requests.get(url, headers=headers) # 发送HTTP请求获取网页内容
hero_resp.encoding = 'gbk' # 解决中文乱码问题
# 解析单个英雄网页内容
etree = html.etree
e = html.etree.HTML(hero_resp.text) # 将获取到的HTML文本转换为Element对象
names = e.xpath('//ul[@class="pic-pf-list pic-pf-list3"]/@data-imgname')[0] # 获取英雄所有皮肤的图片名称
img_names = names.split('|') # 将所有皮肤的名称分割为列表
file_names = [] # 存储皮肤图片的文件名
for img_name in img_names:
if '&' in img_name: # 部分英雄皮肤名不含’&‘,因此需要判断是否含有该字符
file_name, _ = img_name.split('&') # 将皮肤名称按照'&'符号进行分割
else:
file_name = img_name
file_names.append(file_name) # 存储处理后的皮肤名称
# 根据英雄名字创建文件夹,存储该英雄的所有皮肤
print(f'------开始下载{hero["cname"]}的皮肤------')
if not os.path.exists(hero["cname"]): # 如果不存在该英雄的文件夹,则创建该文件夹
os.makedirs(hero["cname"])
# 保存皮肤图片
for i in range(1, len(img_names) + 1):
img_url = f"http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{hero['ename']}/{hero['ename']}-bigskin-{i}.jpg" # 获取皮肤图片链接
img_resp = requests.get(img_url, headers=headers) # 发送HTTP请求获取皮肤图片
with open(f'{hero["cname"]}/{file_names[i - 1]}.jpg', 'wb') as f: # 将皮
3 文件下载
小编已将相应代码和下载的全英雄皮肤打包,各位客官可自取哦~
文件下载方式
扫描下方二维码或打开链接即可下载本项目所有文件。
https://pan.baidu.com/s/1kFugo7vcfABQWh9MbypzrA?pwd=b5e7 提取码: b5e7

文件下载二维码
以上就是所有内容啦,Python小白也可以上手,快夸我!!!

快来一起Happy~ |
|