手把手教你爬取并下载英雄联盟所有英雄皮肤高清大图

利用requests和urlretrieve爬取并下载英雄联盟所有英雄皮肤高清大图

· 不知道屏幕前的你是不是也是一名loler,最近学习爬虫,印象中以前看过爬取英雄联盟的帖子,所以也就自己试了试,结果很是满意,先上效果图。在这里插入图片描述
亲女儿拉克丝
在这里插入图片描述
下面开始手把手教你如何爬取英雄联盟英雄皮肤。

一、分析页面

首先我们先去英雄联盟资料站官网,地址是https://lol.qq.com/data/info-heros.shtml,然后分析他的页面,先查看页面源码,以剑魔为例,可以看到他的名字和头像的图片链接都在id="jSearchHeroDiv"的ul节点下面的li节点中,一个英雄就是一个li节点在这里插入图片描述
点进剑魔主页,地址是https://lol.qq.com/data/info-defail.shtml?id=Aatrox检查皮肤,可以看到不同皮肤只是id(这个ID很重要,后面还会提到)不一样
在这里插入图片描述
知道了这些信息后,我们先直接请求皮肤站页面,看下id="jSearchHeroDiv"的ul节点是什么结果

import requests
from pyquery import PyQuery as pq

url = "https://lol.qq.com/data/info-heros.shtml"
headers = {
		"user-agent":"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36",
	}
response = requests.get(url,headers = headers)
response.encoding = "GBK"
html = response.text
doc = pq(html)
print(doc("#jSearchHeroDiv"))

在这里插入图片描述
发现并没有出来结果,由此可以知道该页面内容是通过js加载出来的,打开Network选项卡,筛选JS请求,然后发现有一个champion.js,点到Preview选项卡,可以看到这里面的数据正好就是英雄信息,再往下啦还可以看到每个英雄的详细信息,然后点进headers选项卡得知他的url为https://lol.qq.com/biz/hero/champion.js
在这里插入图片描述
在这里插入图片描述
然后同理可以分析皮肤界面,也是通过js加载的,检查剑魔的皮肤界面,筛选js请求,同样可以找到一个Aatrox.js,里面的信息就是皮肤的具体信息和id,这里的id刚好就是上面分析页面时发现的不同皮肤对应的不同ID。他的信息是\u+数字的形式,这其实是unicode编码而言,爬取的时候只要给他转码就可以看到具体信息了(后面会展示)。点击他的header,发现他的url为https://lol.qq.com/biz/hero/Aatrox.js。然后在所有请求中可以看到big+ID.js,点开进入Preview选项卡发现正是皮肤大图,点击Header选项卡,发现发现url为https://osswebimg.qq.com/images/lol/web201310/skin/big +ID+.jpg的形式。
在这里插入图片描述
在这里插入图片描述
然后在选择别的英雄进行对比,可以发现,对于每个英雄而言包含皮肤信息的js地址都是https://lol.qq.com/biz/hero/ + 英雄名字+.js的形式,每一个皮肤大图都是https://osswebimg.qq.com/images/lol/web201310/skin/big +ID+.jpg的形式。不过这里的英雄名字都是他们的英文名,还记得我们在champion.js里看到的信息吗,不就正是我们所需要的英雄名称吗?至此我想大家已经有一个爬取思路了。

1、通过获取champion.js里面的信息,得到英雄英文名称
2、通过英雄英文名称就可以去请求每个英雄的具体信息,得到皮肤ID
3、最后请求https://osswebimg.qq.com/images/lol/web201310/skin/big +ID+.jpg获得皮肤高清大图

知道思路后那么我们就按照这个思路开始我们的爬虫吧

二、获取英文名称

首先我们请求先请求"https://lol.qq.com/biz/hero/champion.js"

url = "https://lol.qq.com/biz/hero/champion.js"
headers = {
		"user-agent":"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36",
	}
response = requests.get(url,headers = headers)
response.encoding = 'GBK'
html = response.text
print(html)

在这里插入图片描述
获得的数据和我们在网页中查看的一样,去掉头部就是字典类型,为了操作方便我们将其转换成json类型,然后再看看结果

data = json.loads("{"+response.text.strip("if(!LOLherojs)var LOLherojs={};LOLherojs.champion=")+"}")
#去掉头部的字符串后发现头尾的{}也跟着取消了 ,所以在头尾加上{}

在这里插入图片描述

这样是不是就好看多了,分析的可以在网页的preview选项卡里分析,哪里分好了层更加清晰明了,我们从中分析出ID为英雄的英文名,name+title就是完整的中文名称,比如暗裔剑魔 亚托克斯,我们也将他的id和中文名称拿出来,ID作为后面请求皮肤页面的字段,中文名称我们作为最后保存图片时文件夹的名称。

hero_id_lists = []
hero_chinese_names = []
hero_english_names = data.get("data").keys()
for hero_english_name in hero_english_names:
    hero_id_lists.append(hero_english_name)
print(hero_id_lists)
for hero_id in hero_id_lists:
    first_name = data.get("data").get(hero_id).get("name")
    second_name = data.get("data").get(hero_id).get("title")
    hero_chinese_name = "{0} {1}".format(first_name,second_name)
    #print(hero_chinese_name)
    hero_chinese_names.append(hero_chinese_name)
print(hero_chinese_names)

在这里插入图片描述

三、获取皮肤ID

在这里以剑魔为例,我们来获取到他的所有皮肤的地址,同理删掉头部转换为json格式

id = hero_id_lists[0]
hero_url = "https://lol.qq.com/biz/hero/"+id+".js"
response = requests.get(hero_url,headers=headers)
data = json.loads("{"+response.text.strip("if(!LOLherojs)var LOLherojs={champion:{}};LOLherojs.champion."+id+"=")+"}")
print(data )

在这里插入图片描述
在网页的preview选项卡中观察结构从中分析出皮肤的ID和皮肤的名称,

skins = data.get("data").get("skins")
skin_ids = []
skin_names = []
skin_urls = []
for skin in skins:
    skin_names.append(skin.get("name"))
    skin_ids.append(skin.get("id"))
skin_names[0] = hero_chinese_names[0] #默认皮肤名称为default,因此将其改成对应的名称
print(skin_names)
for skin_id in skin_ids:
    skin_url = "https://ossweb-img.qq.com/images/lol/web201310/skin/big" + skin_id + ".jpg"
    skin_urls.append(skin_url)
print(skin_urls)

在这里插入图片描述
然后检查一下获得的皮肤url是否和网页上的一致。皮肤url用来下载图片,皮肤名称用来命名图片名称。

四、下载并保存皮肤图片

得到的皮肤url后就到了我们最后一步下载了。下载我们使用urlretrieve函数,这个函数一般传2个参数,第一个参数是url,第二个参数是文件名称。我们先查找文件夹,如果不存在先创建文件,然后在里下载数据。

for j in range(len(skin_ids)):
    filename = "F:\\Skin\\"+ hero_chinese_names[0] + "\\"+skin_names[j] + ".jpg"  
    filepath = "F:\\Skin\\"+ hero_chinese_names[0] + "\\"
    #print(filename)
    if not os.path.exists(filepath):
        os.makedirs(filepath)
    urlretrieve(skin_urls[j],filename = filename)
    print("成功下载完"+skin_names[j]+"的皮肤图片")
print("------皮肤下载完成------")

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

在这里插入图片描述

可以看到成功创建了文件夹并下载了图片,而且以皮肤名称明了名。相信你会了一个英雄的皮肤下载那么所有英雄的下载肯定也会了。

五、结语

本人也是python初学者,写博客的目的是为了记录自己的学习过程,希望能帮到也是初学者的你。有哪里不懂尽管留言。源码我就不贴了如果有需要请留言。

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值