【小白必看】轻松获取王者荣耀英雄皮肤图片的Python爬虫程序

news2024/11/28 14:37:18

文章目录

  • 前言
  • 项目运行效果图
  • 导入模块和库
  • 伪装请求头
  • 获取英雄列表
  • 遍历英雄列表
  • 创建英雄目录
  • 访问英雄主页并解析HTML代码
  • 获取皮肤名称
  • 下载皮肤图片
  • 完整代码
  • 总结

在这里插入图片描述

前言

当谈到王者荣耀游戏时,无法忽视的是其丰富多样的英雄皮肤。这些皮肤不仅为玩家提供了个性化的游戏体验,还展示了设计师们的创造力和努力。然而,要手动下载每个英雄的皮肤图片是一项枯燥且费时的任务。
幸运的是,我们可以利用编程的力量来自动化这一过程。本文将介绍如何使用Python编写一个简单的爬虫程序,通过访问英雄主页并解析HTML代码,来批量下载王者荣耀英雄的皮肤图片。

我们将使用requests模块发送HTTP请求,lxml库解析HTML代码,以及其他一些常用的Python模块和库。代码将从官方网站获取英雄列表数据,并遍历列表获取英雄的ID和中文名。然后,我们将访问每个英雄的主页,提取其中的皮肤名称,并根据名称构建皮肤图片的URL。最后,我们将使用requests模块下载图片,并保存到对应的英雄目录中。

这个爬虫程序不仅能够帮助玩家轻松获取王者荣耀英雄的所有皮肤图片,还可以为开发人员提供学习和研究的素材

请继续阅读本文,了解如何使用Python编写这个简单而有用的爬虫程序,并快速获取王者荣耀英雄的精美皮肤图片吧

项目运行效果图

在这里插入图片描述
在这里插入图片描述

导入模块和库

在这里插入图片描述

import requests
from lxml import etree
import os
from time import sleep

这部分代码导入了需要使用的模块和库。requests模块用于发送HTTP请求,lxml库用于解析HTML代码,os模块用于操作文件和目录,time模块中的sleep函数用于控制请求的间隔时间。

伪装请求头

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'}

这里设置了一个伪装的请求头,用于模拟浏览器访问。通过设置请求头,可以避免被服务器识别为爬虫而导致请求被拒绝。

获取英雄列表

hero_list_url = 'https://pvp.qq.com/web201605/js/herolist.json'
hero_list_resp = requests.get(hero_list_url, headers=headers)

发送GET请求获取英雄列表的JSON数据。requests.get()函数用于发送HTTP请求,并返回一个包含服务器响应的Response对象。

遍历英雄列表

for h in hero_list_resp.json():
    ename = h.get('ename')
    cname = h.get('cname')

遍历英雄列表,获取每个英雄的ename(英雄ID)和cname(中文名)。hero_list_resp.json()将服务器响应的JSON数据转换为Python对象,这里是一个包含多个英雄信息字典的列表。

创建英雄目录

if not os.path.exists(cname):
    os.makedirs(cname)

如果英雄目录不存在,则创建英雄目录。os.path.exists()函数用于检查路径是否存在,os.makedirs()函数用于递归创建目录。

访问英雄主页并解析HTML代码

hero_info_url = f'https://pvp.qq.com/web201605/herodetail/{ename}.shtml'
hero_info_resp = requests.get(hero_info_url, headers=headers)
hero_info_resp.encoding = 'gbk'
e = etree.HTML(hero_info_resp.text)

构建英雄主页的URL,并发送GET请求获取页面内容。通过在URL中插入英雄的ename,可以访问到每个英雄的详细信息页面。设置encodinggbk,以正确解析中文字符。使用etree.HTML()函数将页面内容转换为可解析的HTML对象。

获取皮肤名称

names = e.xpath('//ul[@class="pic-pf-list pic-pf-list3"]/@data-imgname')[0]
names = [name[0:name.index('&')] for name in names.split('|')]

使用XPath表达式提取HTML代码中的皮肤名称。这里的XPath表达式定位到ul节点的class属性为pic-pf-list pic-pf-list3的元素,然后提取其中的data-imgname属性值。返回的是一个字符串,包含了多个皮肤名称,用竖线分隔。通过切片和分割操作,将字符串处理成一个包含所有皮肤名称的列表。

下载皮肤图片

for i, n in enumerate(names):
    resp = requests.get(f'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{ename}/{ename}-bigskin-{i+1}.jpg', headers=headers)
    with open(f'{cname}/{n}.jpg', 'wb') as f:
        f.write(resp.content)
    print(f'已下载:{n} 的皮肤')
    sleep(1)

遍历皮肤名称列表,构建皮肤图片的URL并发送GET请求获取图片内容。根据皮肤的URL模式,使用英雄的ename和皮肤的序号构建具体的URL。使用requests.get()函数发送请求,并返回一个包含服务器响应的Response对象。使用open()函数创建一个文件对象,以二进制写入模式打开文件,将图片内容写入该文件中,以保存皮肤图片。最后输出已下载皮肤的信息,并使用sleep(1)函数暂停1秒,控制请求的间隔时间,避免对服务器造成过大的负载。

完整代码

# 发送请求的模块 pip install requests
import requests
# 解析html代码的工具 lxml    pip install lxml
from lxml import etree 
import os
from time import sleep

# 伪装自己
headers ={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'}

# 获取英雄列表的URL
hero_list_url = 'https://pvp.qq.com/web201605/js/herolist.json'
# 发送HTTP请求获取英雄列表数据
hero_list_resp = requests.get(hero_list_url,headers=headers)

# 遍历英雄列表数据
for h in hero_list_resp.json():
   # 获取英雄的ID和中文名
   ename = h.get('ename')
   cname = h.get('cname')
   # 如果英雄目录不存在,则创建
   if not os.path.exists(cname):
       os.makedirs(cname)
       
   # 访问英雄主页
   hero_info_url = f'https://pvp.qq.com/web201605/herodetail/{ename}.shtml'
   hero_info_resp = requests.get(hero_info_url,headers=headers)
   hero_info_resp.encoding='gbk'
   e = etree.HTML(hero_info_resp.text)
   
   # 提取皮肤名称
   names = e.xpath('//ul[@class="pic-pf-list pic-pf-list3"]/@data-imgname')[0]
   names = [name[0:name.index('&')] for name in names.split('|')]
   
   # 遍历每个皮肤名称
   for i,n in enumerate(names):
       # 构建皮肤图片的URL
       resp = requests.get(f'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{ename}/{ename}-bigskin-{i+1}.jpg',headers=headers)
       
       # 保存皮肤图片
       with open(f'{cname}/{n}.jpg','wb') as f:
           f.write(resp.content)
       
       # 打印已下载的皮肤信息
       print(f'已下载:{n} 的皮肤')
       
       # 等待1秒,避免请求频率过快
       sleep(1)

总结

本文介绍了如何使用Python编写一个简单的爬虫程序,来批量下载王者荣耀英雄的皮肤图片。通过访问英雄主页并解析HTML代码,我们可以获取到每个英雄的皮肤名称,并根据名称构建皮肤图片的URL。然后使用Python的requests模块发送HTTP请求,并将下载得到的图片保存到对应的英雄目录中。

这个爬虫程序不仅可以帮助玩家轻松获取王者荣耀英雄的所有皮肤图片,还为开发人员提供了学习和研究的素材。通过阅读本文,读者可以了解到如何使用requests模块发送HTTP请求、如何使用lxml库解析HTML代码,以及一些常用的Python模块和库的使用方法。

在实现过程中,我们还介绍了如何伪装请求头,避免被服务器识别为爬虫。并且,为了控制请求的间隔时间,我们使用了time模块的sleep函数。

通过阅读本文,读者可以学到许多有用的爬虫技巧和Python编程技巧,同时也可以获得更好的游戏体验和更多的创作灵感。希望本文对读者有所帮助,能够在王者荣耀的世界中畅游愉快!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/793289.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文本预处理——文本特征处理

目录 文本特征处理n-gram特征文本长度规范 文本特征处理 n-gram特征 文本长度规范

《面试1v1》Kafka消息是采用Pull还是Push模式

🍅 作者简介:王哥,CSDN2022博客总榜Top100🏆、博客专家💪 🍅 技术交流:定期更新Java硬核干货,不定期送书活动 🍅 王哥多年工作总结:Java学习路线总结&#xf…

(学习笔记-硬件结构)CPU如何执行程序?

冯诺依曼模型 冯诺依曼模型主要由五部分组成:运算器、控制器、存储器、输入设备、输出设备。 控制器(Control Unit):从内存中取指令、翻译指令、分析指令,然后根据指令的内存向有关部件发送控制命令,控制相…

E2E工程问题:小周期转大周期Gateway

摘要: 本文讨论一个具体的工程问题,E2E报文对应的信号,由小周期转大周期导致的E2E校验失败问题。 工程中,网关节点很重要的一个功能就是路由。当然,E2E(End to End)报文也可路由,但…

webpack xxx is not a constructor

环境 webpack5.88.2 vue-router 按需引入 原因 模块循环引用导致 有A B C三个模块 A B模块import C 中导出的class c又依赖B 中Class 的方法 B 又依赖C中的class 此时会导致import 的 C 为undefined

求求你,别这样写简历,我要是HR连面试机会都不给你,别说我没告诉你!

前言 我作为部门的面试官,在此期间也收获了不少简历。但可惜的是,收到的简历数量虽多,但令人中意的却是凤毛菱角,一些应聘者倒不是因为自身能力不足而无法进入面试环节,而是简历本身就没有很好的展示出自己的能力&…

苍穹外卖 Spring Task 来单提醒 催单Apache ECharts day10~11

苍穹外卖-day10 课程内容 Spring Task订单状态定时处理WebSocket来单提醒客户催单 功能实现:订单状态定时处理、来单提醒和客户催单 订单状态定时处理: 来单提醒: 客户催单: 1. Spring Task 1.1 介绍 Spring Task 是Spring框架提供…

k8s中强制删除pv

K8s 集群内有一个已经不再使用的 PV,虽然已经删除了与其关联的 Pod 及 PVC,并对其执行了删除命令,但仍无法正常删除,一直处于 Terminating 状态: 解决办法: 1. 获取pv信息 kubectl get pv 2. 解除pv锁定 …

k8s: kubectl: logs: rotate 问题

https://kubernetes.io/docs/concepts/cluster-administration/logging/ 当kubenet存放container的日志满了的时候,会发生rotate,当rotate发生的时候,是由kubectl logs 这个命令可能会出现以下两个问题: https://github.com/kuber…

30-使用RocketMQ做削峰处理

1、增加排队功能的思路 在出票模块里,一个消费者拿到了某个车次锁,则该车次下所有的票都由他来出,一张一张的出,知道所有的订单都出完。 2、实现排队出票功能 2.1、 修改发送到MQ消息的内容 修改MQ消息内容,只需要通知出哪天和哪个车次的票(即:组成锁的内容),不需要…

网络安全系统中的守护者:如何借助威胁情报 (TI) 提高安全性

在这篇哈巴尔网站上的推文中,我们将解释 TI 缩写背后的含义、为什么需要它、Positive Technologies 收集哪些网络威胁数据以及如何帮助企业预防网络威胁。我们将以四种情况为例,说明公司如何使用 PT Threat Intelligence Feeds 来发现恶意活动并预防攻击…

2023-07-26 LeetCode每日一题(更新数组后处理求和查询)

2023-07-26每日一题 一、题目编号 2569. 更新数组后处理求和查询二、题目链接 点击跳转到题目位置 三、题目描述 给你两个下标从 0 开始的数组 nums1 和 nums2 ,和一个二维数组 queries 表示一些操作。总共有 3 种类型的操作: 操作类型 1 为 querie…

uni-app点击按钮弹出提示框(以弹窗的形式显示),选择确定和取消

学习目标: 学习目标如下所示: uni-app点击提交按钮后弹出提示框,(以弹窗的形式显示),提示用户是否确认提交(即确定和取消),点击确定后调用真正的提交方法,将数据传给后端…

进程虚拟地址空间区域划分

目录 图示 详解 代码段 备注:x86 32位linux环境下,进程虚拟地址空间区域划分 图示 详解 用户空间 用于存储用户进程代码和数据,只能由用户进程访问 内核空间 用于存储操作系统内核代码和数据,只能由操作系统内核访问 text t…

SpringBoot实战(二十三)集成 SkyWalking

目录 一、简介二、拉取镜像并部署1.拉取镜像2.运行skywalking-oap容器3.运行skywalking-ui容器4.访问页面 三、下载解压 agent1.下载2.解压 四、创建 skywalking-demo 项目1.Maven依赖2.application.yml3.DemoController.java 五、构建启动脚本1.startup.bat2.执行启动脚本3.发…

攻防世界-Reverse-re1

题目描述:菜鸡开始学习逆向工程,首先是最简单的题目 下载附件,执行程序,如下界面 1. 思路分析 没啥说的,既然题目都说是一道简单的逆向题,那么直接使用ida逆向即可,看逆向出的结果是否能写入到…

Cesium态势标绘专题-矩形(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…

tensorRT多batch动态推理

tensorRT的多batch推理,导出的onnx模型必须是动态batch,只需在导出的时候,设置一个dynamic_axis参数即可。 torch.onnx.export(hybrik_model, dummy_input, "./best_model.onnx", verboseTrue, input_namesinput_names, \output_…

【Vue3基础】组合事件配合v-model、watch的使用

一、需求描述 在组合事件中&#xff0c;实现在子事件输入框中输入使父事件实时显示输入内容 二、代码参考 1、关注文件&#xff0c;在App中嵌套Main&#xff0c;在Main中嵌套searchDemo 2、Main.vue文件 <template><h3>Main页面</h3><p>搜索内容为…

2023河南萌新联赛第(三)场:郑州大学(两个题目)

1.入门mex 重点 一些数字的mex是从0往上枚举&#xff0c;第一个没出现的数字。请你回答选最多k个数字&#xff0c;mex最大是多少 既然从0开始枚举&#xff0c;那么应该是最小&#xff0c;那么最大是什么&#xff1f; 经过自己的考虑&#xff0c;给出一个样例&#xff0c;0 1 1…