爬虫分析
今天我们的目的是爬取英雄联盟所有英雄的皮肤壁纸,然后下载到本地。
首先我们要找到皮肤壁纸网页地址:
在英雄联盟首页>游戏资料>英雄 网页中我们找到了所有英雄信息。对应网址为:
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刚好是皮肤编号的前三位数字。比如阿狸的信息:
至此我们的分析已经结束了。
爬虫代码
我们先给出编写步骤:
代码:
#!/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与机器学习之路 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!