zoukankan      html  css  js  c++  java
  • 用python的requests第三方模块抓取王者荣耀所有英雄的皮肤

    本文使用python的第三方模块requests爬取王者荣耀所有英雄的图片,并将图片按每个英雄为一个目录存入文件夹中,方便用作桌面壁纸

    下面时具体的代码,已通过python3.6测试,可以成功运行:

    对于所要爬取的网页连接可以通过王者荣耀官网找到,

      1 # -*- coding: utf-8 -*-
      2 """
      3 Created on Wed Dec 13 13:49:52 2017
      4 
      5 @author:KillerTwo
      6 """
      7 import requests
      8 import os
      9 hero_list_url = 'http://pvp.qq.com/web201605/js/herolist.json'
     10 hero_skin_root_url = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/'
     11 skin_base_dir = 'C:\\Users\\lwt27\\Pictures\\image\\heroskin\\'
     12 
     13 
     14 def get_ename(hero_json):#传入获取到的python对象,如hero_list_json
     15     '''获取英雄名称对应英雄编号的一个字典,例如{小乔:106,...}'''
     16     cname_ename = {}
     17     for hero in hero_json:
     18         cname_ename[hero['cname']] = hero['ename']
     19     return cname_ename
     20 
     21 def get_skin_name(hero_json): #传入从网页获取到的json转换为python字典的对象
     22     '''获取英雄名称对应的皮肤的所有皮肤名称的字典,例如
     23     {'小乔':'恋之微风|万圣前夜|天鹅之梦|纯白花嫁|缤纷独角兽',...}'''
     24     cname_skin_name = {}
     25     for hero in hero_json:
     26         cname_skin_name[hero['cname']] = hero['skin_name']
     27     return cname_skin_name
     28 
     29 def get_hero_skin_count(cname_skin_name): #传入英雄名称对应皮肤名称的字典
     30     '''获取每个英雄对应的皮肤的个数,例如{'小乔':5,...}'''
     31     cname_skin_count = {} 
     32     for item in cname_skin_name.items():
     33         cname_skin_count[item[0]] = len(item[1].split('|'))
     34     return cname_skin_count
     35 
     36 def get_skin_name_url(skin_base_rul,cname_skin_count,cname_ename):
     37     #传入皮肤根地址和名称对应皮肤数量的字典和名称对应编号的字典
     38     '''返回英雄名称对应的所有皮肤的url地址列表的字典,例如{小乔:[skin_url1,skin_url2],...}'''
     39     cname_url_list = {}
     40     for cname,count in cname_skin_count.items():
     41         #print(cname)
     42         #print(count)
     43         #print(skin_base_rul)
     44         #print(cname_ename[cname])
     45         base_url = skin_base_rul+str(cname_ename[cname])+'/'+str(cname_ename[cname])+'-bigskin-'
     46         #print(base_url)
     47         skin_url_list = [str(base_url)+str(num)+'.jpg' for num in range(1,count+1)]
     48         cname_url_list[cname] = skin_url_list
     49     return cname_url_list
     50 
     51 #print()
     52 d = get_skin_name_url(hero_skin_root_url,get_hero_skin_count(get_skin_name(hero_list_json)),get_ename(hero_list_json))
     53 #print(d)
     54 
     55 def get_cname_skin_name(cname_skin_name):#传入名称对应皮肤名称字符串的字典
     56     cname_skin_name_dict = {}         #返回名称对应【皮肤名称的列表】的字典
     57     for cname,skin_name_list in cname_skin_name.items():
     58         skin_list = [name for name in skin_name_list.split('|')]
     59         cname_skin_name_dict[cname] = skin_list
     60     return cname_skin_name_dict
     61     
     62 #s = get_skin_name(hero_list_json)
     63 #print(s)
     64 #f = get_cname_skin_name(s)
     65 #print(f)
     66 
     67 def get_hero_skin(cname_url_list,cname_skin_name):#传入名称对应【皮肤名称列表】的字典和名称对应皮肤url列表的字典
     68    # """获取每个英雄的图片"""
     69     for cname,skin_url in cname_url_list.items():
     70         
     71         if mkdir(skin_base_dir+cname):#创建指定目录
     72             os.chdir(skin_base_dir+cname)  #进入到创建的目录
     73             
     74             for i in range(len(skin_url)):
     75                 file_name = cname_skin_name[cname][i]+'.jpg'
     76                 r = requests.get(skin_url[i])
     77                 with open(file_name,'wb') as f:
     78                     f.write(r.content)
     79 #创建目录
     80 def mkdir(path):
     81     # 引入模块
     82     import os
     83     # 去除首位空格
     84     path=path.strip()
     85     # 去除尾部 \ 符号
     86     path=path.rstrip("\\")
     87     # 判断路径是否存在
     88     # 存在     True
     89     # 不存在   False
     90     isExists=os.path.exists(path)
     91     # 判断结果
     92     if not isExists:
     93         # 如果不存在则创建目录
     94         # 创建目录操作函数
     95         os.makedirs(path)
     96         print(path+' 创建成功')
     97         return True
     98     else:
     99         # 如果目录存在则不创建,并提示目录已存在
    100         print(path+' 目录已存在')
    101         return False
    102     return 
    103 
    104 if __name__ == '__main__':
    105     
    106     hero_list_body = requests.get(hero_list_url) #请求英雄列表
    107     hero_list_json = hero_list_body.json()  #将英雄列表的获取的json数据转换为python对象
    108 
    109     cname_ename = {}       #英雄名称对应英雄编号的字典
    110     cname__skin_name = {} #英雄名称对应皮肤名称字符串的字典
    111     cname_skin_count = {} #英雄名称对应皮肤数量的字典
    112     
    113     cname_skin_name_str_list = get_skin_name(hero_list_json)
    114     cname_skin_name_list = get_cname_skin_name(cname_skin_name_str_list)
    115     cname_skin_count = get_hero_skin_count(cname_skin_name_str_list)
    116     cname_ename = get_ename(hero_list_json)
    117     cnam_skin_url_list = get_skin_name_url(hero_skin_root_url,cname_skin_count,cname_ename)
    118     get_hero_skin(cnam_skin_url_list,cname_skin_name_list)

    下面是保存抓取到的图片的文件夹样例:

    以上就是抓取王者荣耀所有英雄皮肤的简单示例,上述的代码并没有使用python多线程执行抓取图片的函数,所以在执行的时候可能需要花费几分钟的时间,

    以后在进行改进,添加使用python多线程执行抓取任务。

  • 相关阅读:
    校外实习-7.28
    校外实习-7.27
    校外实习-7.26
    校外实习-7.25
    校外实习-第三周总结
    校外实习-7.22
    校外实习-7.21
    校外实习-7.20
    作业九—总结
    结对编程项目---四则运算(截图总结篇)
  • 原文地址:https://www.cnblogs.com/yourblog/p/8035180.html
Copyright © 2011-2022 走看看