社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。
本文章纯野生,无任何借鉴他人文章及抄袭等。坚持原创!!
你好。这里是Python爬虫从入门到放弃系列文章。我是SunriseCai。
本文章主要介绍利用爬虫程序下载 英雄联盟的 所有英雄的皮肤。
英雄联盟英雄库:https://lol.qq.com/data/info-heros.shtml
看看英雄联盟网站,如下多图所示:
通过上面几张图片可以看出,这一套下来依旧是个俄罗斯套娃!!!
那么,接下来的就是用代码实现下载图片了。
上面有说到,本文章的需请求的首页为https://lol.qq.com/data/info-heros.shtml。
浏览器打开 网站首页,点击F12,进入开发者模式。看看页面结构,发现了二级页面的链接就在<li>标签里面。perfect !!!
首页请求代码:
import requests
url = 'https://lol.qq.com/data/info-heros.shtml'
headers = {
'User-Agent': 'Mozilla/5.0'
}
def get_hero_list():
res = requests.get(url, headers=headers)
if res.status_code == 200:
print(res.text)
else:
print('your code is fail')
!!!
执行上述代码之后,发现并没有上图中的<li>标签的内容,这是怎么回事呢?<li>标签的内容极有可能是通过xhr异步加载出来的的文件,咱们来抓包看看!!
再次请求首页时候发现,在xhr这里,有一个hero_list.js文件,翻译过来就是英雄列表。
看到hero_list.js的url为 :https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js
点击之后,发现这正是我们需要的内容!!!
就是这里,注意看画框红色的地方有一个heroId,这个就是上面说的二级页面url屁股的Id
在浏览器输入hero_list.js文件的地址,如下图:
非常好,请求代码也是很简单,只需要将上面代码的url替换为https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js 即可。
这里以黑暗之女–安妮 为例,看到安妮共有13个皮肤。
抓包发现,有个1.js文件的数据刚好对应了安妮的13个皮肤。
1.js文件的url为:https://game.gtimg.cn/images/lol/act/img/js/hero/1.js
2.js文件的url为:https://game.gtimg.cn/images/lol/act/img/js/hero/2.js
当然了,这个后面的Id就是每个英雄的heroId。
用浏览器打开1.js文件的url,如下图所示:
看到1.js文件有几个img的url,他们所表示图片的像素比如下:
名称 | 像素比 |
---|---|
mainImg | 980x500 |
iconImg | 60x60 |
loadingImg | 308x560 |
videoImg | 130x75 |
sourceImg | 1920x470 |
本次文章用mainImg做下载演示。
在这里,捋一下思路:
import requests
url = 'https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js'
headers = {
'User-Agent': 'Mozilla/5.0'
}
def get_hero_list():
"""
:return: 获取英雄名称与heroId
"""
res = requests.get(url, headers=headers)
if res.status_code == 200:
data = json.loads(res.text)
for item in data['hero']:
id = item['heroId']
name = item['name']
title = item['title']
print(id, name, title)
else:
print('your code is fail')
get_hero_list()
import requests
skinUrl = 'https://game.gtimg.cn/images/lol/act/img/js/hero/{}.js'
headers = {
'User-Agent': 'Mozilla/5.0'
}
def get_skin_url(Id):
"""
:param Id: 英雄ID,用于拼接url
:return:
"""
res = requests.get(skinUrl.format(Id), headers=headers)
if res.status_code == 200:
data = json.loads(res.text)
for item in data['skins']:
url = item['mainImg']
name = item['name'].replace('/', '')
print(url, name)
else:
print('your code is fail')
get_hero_list()
# -*- coding: utf-8 -*-
# @Time : 2020/1/28 21:12
# @Author : SunriseCai
# @File : YXLMSpider.py
# @Software: PyCharm
import os
import json
import time
import requests
"""英雄联盟皮肤爬虫程序"""
class YingXLMSpider(object):
def __init__(self):
self.onePageUrl = 'https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js'
self.skinUrl = 'https://game.gtimg.cn/images/lol/act/img/js/hero/{}.js'
self.headers = {
'User-Agent': 'Mozilla/5.0'
}
def get_heroList(self):
"""
:return: 获取英雄的heroId,和英雄名称
"""
res = requests.get(url=self.onePageUrl, headers=self.headers)
if res.status_code == 200:
data = json.loads(res.text)
for item in data['hero']:
Id = item['heroId']
title = item['title']
self.get_skin_url(Id, title)
else:
print('your code is fail')
def get_skin_url(self, Id, folder):
"""
:param Id: 英雄ID,用于拼接url
:param folder: 以英雄名称命名的文件夹
:return:
"""
url = self.skinUrl.format(Id)
res = requests.get(url, headers=self.headers)
if res.status_code == 200:
data = json.loads(res.text)
for item in data['skins']:
url = item['mainImg']
name = item['name'].replace('/', '')
self.download_picture(url, name, folder)
else:
print('your code is fail')
def download_picture(self, url, name, folder):
"""
:param url: 皮肤地址
:param name: 皮肤名称
:param folder: 文件夹
:return:
"""
# 判断如果文件夹不存在则创建
if not os.path.exists(folder):
os.makedirs(folder)
# 判断url不为空和 图片不存在本地则下载(主要用于断点重连)
if not url == '' and not os.path.exists('%s/%s.jpg' % (folder, name)):
time.sleep(1)
res = requests.get(url, headers=self.headers)
with open('%s/%s.jpg' % (folder, name), 'wb') as f:
f.write(res.content)
print('%s.jpg' % name, '下载成功')
f.close()
def main(self):
self.get_heroList()
if __name__ == '__main__':
spider = YingXLMSpider()
spider.main()
来看看成果:
最后来总结一下本章的内容:
下一篇文章,名为 《Python爬虫从入门到放弃 09 | Python爬虫实战–下载某音乐网–待定》。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!