分析页面
点击查看源代码,并搜索关键字(英雄名称)黑暗之女
,发现关键字并不在源代码中,说明该页面是一个动态加载页面。
通过检查,发现响应的数据都在1.js
中。
提取数据
获取单个英雄的皮肤
既然数据在1.js
中,我们就拿到它的响应数据(最后面的参数证实没有用,去掉即可)
import requests
from urllib.request import urlretrieve
from time import sleep
url = f"https://game.gtimg.cn/images/lol/act/img/js/hero/1.js"
resp = requests.get(url)
# 获取响应内容
for sk in resp.json().get("skins"):
if sk.get('mainImg'):
name = sk.get("name").replace(" ","_")
img_url = sk.get("mainImg")
print(f"皮肤名{name},皮肤下载地址{img_url}爬取完成")
# 下载图片
# urlretrieve可以构造一个下载器,参数为图片下载地址和图片路径
# 用with open也可以
urlretrieve(img_url,filename=f"./imgs/{name}.jpg")
print("下载完成”)
此时就拿到了第一个英雄的全部皮肤
获取英雄列表
通过和上面相同的方法,得到英雄列表响应数据存放的js文件
url = "https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js"
resp = requests.get(url,headers)
for hero in resp.json().get("hero"):
hero_id = hero.get("heroId")
hero_name = hero.get("name")
整理代码
Python
是一个面向对象的语言,我们将它的各个功能各自封装起来,加一点点细节
import requests
from fake_useragent import UserAgent
from urllib.request import urlretrieve
from time import sleep
headers = {
"User-Agent":UserAgent().chrome
}
def get_hreo_img(hero_id=1):
url = f"https://game.gtimg.cn/images/lol/act/img/js/hero/{hero_id}.js"
# 构建请求头
resp = requests.get(url,headers)
# 获取响应内容
for sk in resp.json().get("skins"):
if sk.get('mainImg'):
name = sk.get("name").replace(" ","_")
img_url = sk.get("mainImg")
print(f"皮肤名{name},皮肤下载地址{img_url}爬取完成")
# 下载图片
urlretrieve(img_url,filename=f"./imgs/{name}.jpg")
sleep(1)
print("爬取完成")
def get_hero_list():
url = "https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js"
# 获取响应数据
resp = requests.get(url,headers)
for hero in resp.json().get("hero"):
hero_id = hero.get("heroId")
hero_name = hero.get("name")
# 将数据一一返回
yield (hero_id,hero_name)
if __name__ == "__main__":
for hero_id,hero_name in get_hero_list():
print(f"正在下载---{hero_name}---")
get_hreo_img(hero_id)
print(f"下载完成---{hero_name}---")