本次共使用了四个库,分别是
requests
: 用于发送HTTP请求,获取网页内容。
lxml
: 一个用于处理XML和HTML的库,这里主要用于解析HTML内容。
os
: 提供了一种使用操作系统功能的接口,这里主要用于创建目录和文件操作。
time
模块中的 sleep
函数:用于在执行过程中添加延迟,这里是为了控制请求的频率,避免对服务器造成过大压力。
如果没有安装库的话需要安装
使用以下命令安装
pip install name
pip install name #name是要安装的库的名字
如果有不清楚pip命令的友友可以参考小编上一篇文章
导入我们要使用的库
import requests
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'
获取英雄列表的响应
hero_list_resp = requests.get(hero_list_url, headers=headers)
定义在D盘上保存图片的基础路径
base_path = 'D:/文档/王者荣耀皮肤/'
遍历英雄和皮肤列表
# 遍历英雄列表
for h in hero_list_resp.json():
# 获取英雄的编号和中文名
ename = h.get('ename')
cname = h.get('cname')
# 构建英雄的目录路径
hero_directory = os.path.join(base_path, cname)
# 如果目录不存在,则创建
if not os.path.exists(hero_directory):
os.makedirs(hero_directory)
# 获取英雄详细信息的URL
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'
# 使用lxml库解析HTML
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
skin_url = f'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{ename}/{ename}-bigskin-{i + 1}.jpg'
# 获取皮肤图片的响应
resp = requests.get(skin_url, headers=headers)
将图片保存到目标路径
with open(os.path.join(hero_directory, f'{n}.jpg'), 'wb') as f:
f.write(resp.content)
打印已下载的信息
print(f'已下载:{n} 的皮肤')
等待1秒,避免请求频率过快
sleep(1)
完整代码
import requests
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'}
hero_list_url = 'https://pvp.qq.com/web201605/js/herolist.json'
hero_list_resp = requests.get(hero_list_url, headers=headers)
base_path = 'D:/文档/王者荣耀皮肤/'
for h in hero_list_resp.json():
ename = h.get('ename')
cname = h.get('cname')
hero_directory = os.path.join(base_path, cname)
if not os.path.exists(hero_directory):
os.makedirs(hero_directory)
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):
resp = requests.get(
f'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{ename}/{ename}-bigskin-{i + 1}.jpg',
headers=headers)
with open(os.path.join(hero_directory, f'{n}.jpg'), 'wb') as f:
f.write(resp.content)
print(f'已下载:{n} 的皮肤')
sleep(1)
运行结果