Python网络爬虫入门实践Python及网络爬虫

爬虫入门实践-下载王者荣耀游戏人物皮肤

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!')
上一篇下一篇

猜你喜欢

热点阅读