1、首先,伪装用户代理访问要爬取的皮肤网站:鼠标点中一个皮肤后,鼠标右键选“检查”,选择“Network”,复制User-Agent后面的代码。
如果右键选检查后出现空白框则需要刷新。
2、下一步,每个英雄皮肤有1到n个不等,所以我们需要遍历对应英雄的每个皮肤。
以“夏洛特”为例,每个皮肤下面有对应皮肤的中文名字,所以我们要用xpath定位数据列表:
在皮肤页面选择“xpath.helper”插件,输入://ul[@class='pic-pf-list pic-pf-list3']
注意:
尽量用chrome浏览器的xpath插件,没有的话应用商店下载一个即可。
在编码中要用到gbk防止出现中文乱码:hero_info_resp.encoding = 'gbk'
遍历中要注意hero-info后面的两串数字要改为之前定义了的名称:resp = requests.get(f'https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{ename}/{ename}-bigskin-{i+1}.jpg',headers=headers)
bigskn后面也要改为要下载的图片名称:{i+1}.jpg
我们的项目是获取所有英雄的皮肤,并且要把皮肤照片保存到各自英雄的文件夹中,文件夹以英雄名字命名,下载时间是每隔一秒下载一个。
具体代码如下:
import requests
#解析html工具 lxml 原则上python无法直接提取HTML代码 etree用xpath提取
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/120.0.0.0 Safari/537.36'}
#英雄头像
hero_info_url = 'https://pvp.qq.com/web201605/js/herolist.json'
hero_info_resp = requests.get(hero_info_url,headers=headers)
# print(hero_info_resp.json())
#每个英雄保存在单独文件夹
for h in hero_info_resp.json():
ename = h.get('ename')
cname = h.get('cname')
if not os.path.exists(cname):
os.makedirs(cname)
#访问英雄主页
hero_info_url = '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]
#去掉原有的字符&0 &1 &2 &3
names = [name[0:name.index('&')] for name in names.split('|')]
#发送请求
#遍历name值给n,n是第几次遍历
for i,n in enumerate(names):
resp = requests.get(f'https://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)
最后的每一秒下载一个是因为避免服务器防止反爬而封掉我们的IP,所以爬取时要降低访问频率。