前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用Python爬取英雄联盟英雄皮肤壁纸

用Python爬取英雄联盟英雄皮肤壁纸

作者头像
HuangWeiAI
发布2019-10-24 15:22:31
1.1K0
发布2019-10-24 15:22:31
举报
文章被收录于专栏:浊酒清味

爬虫分析

今天我们的目的是爬取英雄联盟所有英雄的皮肤壁纸,然后下载到本地。

首先我们要找到皮肤壁纸网页地址:

在英雄联盟首页>游戏资料>英雄 网页中我们找到了所有英雄信息。对应网址为:

http://lol.qq.com/web201310/info-heros.shtml

这时候每一个英雄头像都可以点击,进去之后会有英雄的皮肤壁纸:

我们分析每一个英雄主页网址的规律:

阿狸:

http://lol.qq.com/web201310/info-defail.shtml?id=Ahri

暗裔剑魔:

http://lol.qq.com/web201310/info-defail.shtml?id=Aatrox

其实规律已经出来了,就是网址最后的格式为id加上英雄名字。

接下来就是用浏览器查看页面源代码,寻找和英雄皮肤名称以及图片格式"jpg"有关的线索,最终发现关于阿狸的皮肤:

每个图片的url只需用

“http://osswebimg.qq.com/images/lol/web201310/skin/big”加上后面的代码1030**.jpg 就能够获得。

比如默认皮肤是103000,高丽风情皮肤是103001,等等,以此类推。

由于我们需要遍历所有英雄的id以及相关皮肤编号。用抓包的方式我们找到了文件champion.js中包含我们所需要的信息:

里面包含了英雄名称以及对应的key。这里的key刚好是皮肤编号的前三位数字。比如阿狸的信息:

至此我们的分析已经结束了。

爬虫代码

我们先给出编写步骤:

  1. 请求champion.js,获得文件
  2. 处理champion.js文件,获得英雄英文名称
  3. 构建英雄英文名称.js文件的url地址,并且获取文件
  4. 处理英雄英文名称.js文件,获得皮肤名称以及对应代码
  5. 构建皮肤壁纸的url地址,下载保存

代码:

代码语言:javascript
复制
#!/usr/bin/python# -*- coding: utf-8 -*- # author: KK.  time:2018/3/20
import requestsimport reimport os

def get_json(url):    r = requests.get(url)    json_file = r.content.decode('gbk')    return json_file

def get_dict_of_champion_list(champion_list):    str1 = r'champion={"keys":'    str2 = r',"data":{"Aatrox":'    champion_list_str = str(champion_list).split(str1)[1].split(str2)[0]    champion_list_dict = eval(champion_list_str)    return champion_list_dict

def get_dict_of_champion(champion_json):    str1 = r'"skins":['    str2 = r'],"info"'    champion0 = str(champion_json).split(str1)[1].split(str2)[0]    champion_id = re.findall(r'{(.*?),"num"', champion0)    champion_name = re.findall(r'"num":.*?,(.*?),"chromas"', champion0)    champion = []    for m in range(len(champion_id)):        champion_str = '{' + champion_id[m] + ',' + champion_name[m] + '}'        champion_dict = eval(champion_str)        champion.append(champion_dict)    return champion

def get_champion_default_name(champion_json):    str3 = '={"data":'    str4 = ',"tags'    name_str = str(champion_json).split(str3)[1].split(str4)[0] + '}'    name_dict = eval(name_str)    default_name = name_dict['name'] + ' ' + name_dict['title']    return default_name

def download(champion_dict, default_name):    for m in range(len(champion_dict)):        img_id = champion_dict[m]['id']        name = champion_dict[m]['name'].replace('default', default_name)        name = name.replace("\\", "")      #去除特殊字符        name = name.replace("/", "")        print (name)        img_url = 'http://ossweb-img.qq.com/images/lol/web201310/skin/big{}.jpg'.format(img_id)        r = requests.get(img_url)        img = r.content        with open('{}.jpg'.format(name), 'wb') as f:            f.write(img)            print('已下载图片:{}.jgp'.format(name))

def run(url):    champion_list0 = get_json(url)    # 获取包含所有英雄名称的js文件    champion_list = get_dict_of_champion_list(champion_list0)    # 把获取到的文件处理成想要的格式
    # os.path.join(r'/输入你想要保存到的路径地址/')    # os.chdir(r'/输入你想要保存到的路径地址/')    # 建立lol文件夹,并且在将工作目录转换到此文件夹
    for value in champion_list.values():        champion_json_url = 'http://lol.qq.com/biz/hero/{}.js'.format(value)        champion_json = get_json(champion_json_url)        champion_dict = get_dict_of_champion(champion_json)        default_name = get_champion_default_name(champion_json)        download(champion_dict, default_name)    print('下载完成')

if __name__ == '__main__':    champion_list_json_url = 'http://lol.qq.com/biz/hero/champion.js'    run(champion_list_json_url)

这个代码是参考以下网址:

https://zhuanlan.zhihu.com/p/34835768

由于windows系统中文件名字不能含有斜杠“/”“\”。因此,我加了两句代码过滤掉文件名字中的特殊符号。

结果展示

ig的冠军皮肤:

还有一些好看的:

▼更多精彩推荐,请关注我们

Python新手入门指引

Python快速入门(一)

Python分析红楼梦,宝玉和十二钗的人物关系

带你了解一下神奇的Github

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python与机器学习之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档