Python爬虫从入门到放弃 08 | Python爬虫实战--下载英雄联盟全英雄皮肤

此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。
本文章纯野生,无任何借鉴他人文章及抄袭等。坚持原创!!

前言

你好。这里是Python爬虫从入门到放弃系列文章。我是SunriseCai。

结合视频观看,味道更佳!

【Python爬虫入门案例】爬取英雄联盟全皮肤:https://www.bilibili.com/video/BV1nQ4y1T7k2


本文章主要介绍利用爬虫程序下载 英雄联盟的 所有英雄的皮肤。

英雄联盟英雄库:https://lol.qq.com/data/info-heros.shtml

1. 文章思路

看看英雄联盟网站,如下多图所示:

  • 首页(一级页面)
    Python爬虫从入门到放弃 08 | Python爬虫实战--下载英雄联盟全英雄皮肤_第1张图片
  • 皮肤页面(二级页面)
  • 图片(三级页面)
    Python爬虫从入门到放弃 08 | Python爬虫实战--下载英雄联盟全英雄皮肤_第2张图片

通过上面几张图片可以看出,这一套下来依旧是个俄罗斯套娃!!!

  1. 访问 首页(一级页面) 获取 所有英雄链接(二级页面)
  2. 访问 英雄链接(二级页面) 获取 图片链接(三级页面)
  3. 访问 图片链接(三级页面),保存图片。Python爬虫从入门到放弃 08 | Python爬虫实战--下载英雄联盟全英雄皮肤_第3张图片

那么,接下来的就是用代码实现下载图片了。

2. 请求 + 分析 网页

上面有说到,本文章的需请求的首页为https://lol.qq.com/data/info-heros.shtml

2.1 请求首页

浏览器打开 网站首页,点击F12,进入开发者模式。看看页面结构,发现了二级页面的链接就在

  • 标签里面。perfect !!!

    Python爬虫从入门到放弃 08 | Python爬虫实战--下载英雄联盟全英雄皮肤_第4张图片

    • 相信细心的你已经发现,二级页面url的规律为:https://lol.qq.com/data/info-defail.shtml?id= 这一串字符后面跟一个数字,那这个数字是如何而来的呢?下面会讲解到。

    首页请求代码:

    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')
    

    !!!
    执行上述代码之后,发现并没有上图中的

  • 标签的内容,这是怎么回事呢?
  • 标签的内容极有可能是通过xhr异步加载出来的的文件,咱们来抓包看看!!

    • 再次请求首页时候发现,在xhr这里,有一个hero_list.js文件,翻译过来就是英雄列表

    • 看到hero_list.jsurl为 :https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js
      Python爬虫从入门到放弃 08 | Python爬虫实战--下载英雄联盟全英雄皮肤_第5张图片

    • 点击之后,发现这正是我们需要的内容!!!

    • 就是这里,注意看画框红色的地方有一个heroId,这个就是上面说的二级页面url屁股的Id
      Python爬虫从入门到放弃 08 | Python爬虫实战--下载英雄联盟全英雄皮肤_第6张图片

    • 在浏览器输入hero_list.js文件的地址,如下图:
      Python爬虫从入门到放弃 08 | Python爬虫实战--下载英雄联盟全英雄皮肤_第7张图片
      非常好,请求代码也是很简单,只需要将上面代码的url替换为https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js 即可。

    2.2 请求二级页面(皮肤页面 )

    这里以黑暗之女–安妮 为例,看到安妮共有13个皮肤。

    • 抓包发现,有个1.js文件的数据刚好对应了安妮13个皮肤。
      Python爬虫从入门到放弃 08 | Python爬虫实战--下载英雄联盟全英雄皮肤_第8张图片

    • 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
      Python爬虫从入门到放弃 08 | Python爬虫实战--下载英雄联盟全英雄皮肤_第9张图片

    • 用浏览器打开1.js文件的url,如下图所示:
      Python爬虫从入门到放弃 08 | Python爬虫实战--下载英雄联盟全英雄皮肤_第10张图片

    看到1.js文件有几个imgurl,他们所表示图片的像素比如下:

    名称 像素比
    mainImg 980x500
    iconImg 60x60
    loadingImg 308x560
    videoImg 130x75
    sourceImg 1920x470

    本次文章用mainImg做下载演示。

    在这里,捋一下思路:

    1. 请求https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js 获取英雄名称Id
    2. 根据Id去拼接英雄皮肤的urlhttps://game.gtimg.cn/images/lol/act/img/js/hero/1.jsId替换数字1
    3. 上述请求后可以得到图片的url了,请求图片url即可。

    3. 代码部分

    3.1 代码:首页

    • 请求首页,获取二级页面(皮肤页面的链接)
    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()
    
    
    • 结果如下:
      Python爬虫从入门到放弃 08 | Python爬虫实战--下载英雄联盟全英雄皮肤_第11张图片

    3.2 代码:二级页面(皮肤页面)

    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()
    
    • 结果如下:
    • 值得注意的是,如果是一款皮肤有多个颜色的情况,则有可能不带mainImgurl
      Python爬虫从入门到放弃 08 | Python爬虫实战--下载英雄联盟全英雄皮肤_第12张图片

    3.3 完整代码

    • 复制黏贴即可运行
    # -*- 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爬虫从入门到放弃 08 | Python爬虫实战--下载英雄联盟全英雄皮肤_第13张图片

    • 本篇文章很水,但是总体思路是正确的。建议各位通过复制黏贴代码去执行一番,有任何疑问请先自己动手解决,尽信书则不如无书
    • 实在解决不了可以一起交流哟。

    最后来总结一下本章的内容:

    1. 介绍了英雄联盟网站全英雄皮肤的爬虫思路
    2. 代码展示

    sunrisecai

    • 感谢你的耐心观看,点关注,不迷路。
    • 为方便菜鸡互啄,欢迎加入QQ群组织:648696280

    下一篇文章,名为 《Python爬虫从入门到放弃 09 | Python爬虫实战–下载网易云音乐》

  • 你可能感兴趣的:(Python爬虫从入门到放弃 08 | Python爬虫实战--下载英雄联盟全英雄皮肤)