爬取英雄联盟全皮肤

前言

很多小伙伴都玩过英雄联盟吧,看到这些英雄酷炫的皮肤,想不想把它下载下来呢?如果一张一张的手工去下载,那可太慢啦。下面博主教大家使用python快速地把这些皮肤拿下来吧。

网页分析

我们打开英雄联盟的网站。
在这里插入图片描述
发现这里只有英雄默认的头像图片,而且是小图,这当然不是我们想要的,我们点击进去详情页。
在这里插入图片描述
我们找到了大图的url,但是查看网页源代码里面并没有这个url,那我们只好分析一下浏览器收到的js啦。
分析network里的js,我们发现了两个有用的js文件。
在这里插入图片描述
这个JS里包含了所有英雄的英文名字和唯一id号。
在这里插入图片描述
这个JS包含了一个英雄的所有皮肤id和皮肤中文名字(这里需要解码)。
分析每个皮肤,我们发现皮肤的url有一个规律,是由https://game.gtimg.cn/images/lol/act/img/skin/big皮肤的id号组成,我们只需要从js文件中提取每个英雄皮肤的id和名字就可以开始爬取了。

模块要求

  1. requests
  2. os
  3. json
  4. re

程序代码

#导入所需要的模块
import requests
import re
import json
import os
#关闭requests警告
requests.packages.urllib3.disable_warnings()
#包含所有英雄名字的js
heroname_js = "https://lol.qq.com/biz/hero/champion.js"
#含有一个英雄所有皮肤名字和id的js
skinname_js = "https://lol.qq.com/biz/hero/{}.js"
#英雄皮肤url
skinurl = "https://game.gtimg.cn/images/lol/act/img/skin/big{}.jpg"
#定义请求头
headers = {
    "user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 "
                  "(KHTML, like Gecko) Chrome/73.0.3683.75 Mobile Safari/537.36"
}
#请求
js_html = requests.get(url=heroname_js,headers=headers).text
#提取出含有全英雄名字的字典
hero_namedict = re.findall('"keys":(.*?),"data"',js_html)[0]
#解析json
dict_id = json.loads(hero_namedict)

if __name__ == '__main__':
    #创建存放皮肤的文件夹
    if not os.path.exists("英雄联盟皮肤"):
        os.mkdir("英雄联盟皮肤")
    #循环提取
    for i, j in list(dict_id.items()):
        #获取每个英雄的js文件url
        name_js = skinname_js.format(j)
        #请求
        content = requests.get(url=name_js, headers=headers, verify=False).text
        #定义提取的区域
        choice_scope = re.findall('(.*?)"info":', content)[0]
        name_list = re.findall('"name":"(.*?)",', choice_scope)
        # 拿到了英雄的名字
        hero_name = name_list[0].encode('utf-8').decode('unicode_escape')
        # 每一个英雄皮肤的名字列表
        skin_names = name_list[1:]
        # 每一个英雄皮肤的id列表
        skin_ids = re.findall('"id":"(.*?)",', choice_scope)[1:]
        #为每个英雄创建单独的文件夹
        if not os.path.exists("英雄联盟皮肤/{}".format(hero_name)):
            os.mkdir("英雄联盟皮肤/{}".format(hero_name))
        for skinid,skinname in zip(skin_ids,skin_names):
            if 'K\/DA' in skinname:
                skinname = skinname[0] + ' ' + skinname[3:]
            #解码英雄皮肤名字
            skinname = skinname.encode('utf-8').decode('unicode_escape')
            #下载图片
            imgcontent = requests.get(skinurl.format(skinid),headers=headers)
            with open("英雄联盟皮肤/{}/{}.jpg".format(hero_name,skinname),"wb") as f:
                f.write(imgcontent.content)
            print("{}下载成功!".format(skinname))

以上就是今天博主与大家分享的内容啦,希望大家能够有所收获,祝大家学习进步。
ps:此程序每一次执行都是重新开始爬取,没有实现增量爬取,所有需要,可以把图片url存入redis数据库中,利用hashlib实现去重效果,即可实现增量爬虫。

猜你喜欢

转载自blog.csdn.net/weixin_42494845/article/details/105110255