爬虫入门实践-下载王者荣耀游戏人物皮肤
2018-04-29 本文已影响29人
代码小工蚁
爬虫入门实践-下载王者荣耀游戏人物皮肤
此为代码小工蚁根据掘金文章《Python爬虫:十几行代码下载王者荣耀所有皮肤》重新编写版。
使用了requests库,同时加入文件夹、文件存在判断,尽量使用函数来完成,追求的不是代码少,而是把思路清晰放在第一位。
共赏,备存。
共262张图片。
共262张英雄图片 高清图部分109-妲己-热情桑巴
2018-04-29
# coding=utf-8
# 爬虫实践:下载王者荣耀游戏人物皮肤
# 原文地址:https://juejin.im/post/5ae282876fb9a07abd0d6015
# 本代码是代码小工蚁重新编写版
# date: 2018-04-28
import os
import time
import requests
# 截取路径中的文件名 os.path.basename(save_file_name)
# 文件或目录是否存在 os.path.exists(save_file_name)
# 文件长度 os.path.getsize(save_file_name)
# 路径拼接 os.path.join(os.getcwd(),skin_save_dir)
def get_skin_list(json_url):
"""获取游戏人物信息列表,返回类型:列表"""
try:
r = requests.get(json_url, timeout=20)
r.raise_for_status()
r.encoding = 'utf-8'
return r.json()
except Exception as e:
print('Error: ', e)
return []
def download_skin(hero_dict, save_dir):
"""根据游戏人物的字典信息下载相应皮肤"""
# hero_dict 人物信息,字典类型
# save_dir 皮肤保存位置
hero_ename = str(hero_dict['ename'])
skin_names = hero_dict['skin_name'].split('|')
hero_skin_num = len(skin_names)
for skin_no in range(1,hero_skin_num+1):
skin_url = 'https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/'
skin_url += hero_ename + '/' + hero_ename + '-bigskin-' + str(skin_no) + '.jpg'
save_file_name = hero_ename + '-' + hero_dict['cname']+ '-' + skin_names[skin_no-1] + '.jpg'
save_file_name = os.path.join(save_dir, save_file_name)
# 文件不存在 或 文件长度为0时,下载数据
if not os.path.exists(save_file_name) or os.path.getsize(save_file_name) == 0:
print('正在下载:{} ...'.format(os.path.basename(save_file_name)))
get_img_data(skin_url, save_file_name)
time.sleep(0.5)
else:
print('文件已存在:{} ...'.format(os.path.basename(save_file_name)))
def get_img_data(img_url,file_name):
"""下载图片数据"""
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36"}
try:
r = requests.get(img_url, headers=headers, timeout=20)
r.raise_for_status()
if r.status_code == 200:
with open(file_name, 'wb') as fw:
fw.write(r.content)
except Exception as e:
print('Error: ', e)
return
"""
# 返回列表中的数据是dict类型,取其中一项,如:
看数据:
{
'ename': 105,
'cname': '廉颇',
'title': '正义爆轰',
'new_type': 0,
'hero_type': 3,
'skin_name': '正义爆轰|地狱岩魂'
}
网页查看对应人物:
https://pvp.qq.com/web201605/herodetail/105.shtml
有2款皮肤:正义爆轰 地狱岩魂
F12分析找到:
<img src="//game.gtimg.cn/images/yxzj/img201606/heroimg/105/105-smallskin-1.jpg" alt="" data-imgname="//game.gtimg.cn/images/yxzj/img201606/skin/hero-info/105/105-bigskin-1.jpg" data-title="正义爆轰">
<img src="//game.gtimg.cn/images/yxzj/img201606/heroimg/105/105-smallskin-2.jpg" alt="" data-imgname="//game.gtimg.cn/images/yxzj/img201606/skin/hero-info/105/105-bigskin-2.jpg" data-title="地狱岩魂">
对应大图地址:
https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/105/105-bigskin-1.jpg
https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/105/105-bigskin-2.jpg
构建下载地址:
https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{ename}/{ename}-bigskin-{skin_no}.jpg
skin_no = range(1,len(skin_name.split('|'))+1)
"""
if __name__ == '__main__':
skin_json_url = 'http://pvp.qq.com/web201605/js/herolist.json'
skin_save_dir = 'img'
skin_save_dir = os.path.join(os.getcwd(),skin_save_dir)
if not os.path.exists(skin_save_dir):
os.mkdir(skin_save_dir)
hero_infos = get_skin_list(skin_json_url)
for hero_info in hero_infos:
download_skin(hero_info, skin_save_dir)
print('Done!')