用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例


Posted in Python onDecember 14, 2017

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

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

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

# -*- coding: utf-8 -*-
"""
Created on Wed Dec 13 13:49:52 2017
@author:KillerTwo
"""
import requests
import os
hero_list_url = 'http://pvp.qq.com/web201605/js/herolist.json'
hero_skin_root_url = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/'
skin_base_dir = 'C:\\Users\\lwt27\\Pictures\\image\\heroskin\\'

def get_ename(hero_json):#传入获取到的python对象,如hero_list_json
 '''获取英雄名称对应英雄编号的一个字典,例如{小乔:106,...}'''
 cname_ename = {}
 for hero in hero_json:
 cname_ename[hero['cname']] = hero['ename']
 return cname_ename
def get_skin_name(hero_json): #传入从网页获取到的json转换为python字典的对象
 '''获取英雄名称对应的皮肤的所有皮肤名称的字典,例如
 {'小乔':'恋之微风|万圣前夜|天鹅之梦|纯白花嫁|缤纷独角兽',...}'''
 cname_skin_name = {}
 for hero in hero_json:
 cname_skin_name[hero['cname']] = hero['skin_name']
 return cname_skin_name
def get_hero_skin_count(cname_skin_name): #传入英雄名称对应皮肤名称的字典
 '''获取每个英雄对应的皮肤的个数,例如{'小乔':5,...}'''
 cname_skin_count = {} 
 for item in cname_skin_name.items():
 cname_skin_count[item[0]] = len(item[1].split('|'))
 return cname_skin_count
def get_skin_name_url(skin_base_rul,cname_skin_count,cname_ename):
 #传入皮肤根地址和名称对应皮肤数量的字典和名称对应编号的字典
 '''返回英雄名称对应的所有皮肤的url地址列表的字典,例如{小乔:[skin_url1,skin_url2],...}'''
 cname_url_list = {}
 for cname,count in cname_skin_count.items():
 #print(cname)
 #print(count)
 #print(skin_base_rul)
 #print(cname_ename[cname])
 base_url = skin_base_rul+str(cname_ename[cname])+'/'+str(cname_ename[cname])+'-bigskin-'
 #print(base_url)
 skin_url_list = [str(base_url)+str(num)+'.jpg' for num in range(1,count+1)]
 cname_url_list[cname] = skin_url_list
 return cname_url_list
#print()
d = get_skin_name_url(hero_skin_root_url,get_hero_skin_count(get_skin_name(hero_list_json)),get_ename(hero_list_json))
#print(d)
def get_cname_skin_name(cname_skin_name):#传入名称对应皮肤名称字符串的字典
 cname_skin_name_dict = {}  #返回名称对应【皮肤名称的列表】的字典
 for cname,skin_name_list in cname_skin_name.items():
 skin_list = [name for name in skin_name_list.split('|')]
 cname_skin_name_dict[cname] = skin_list
 return cname_skin_name_dict
 
#s = get_skin_name(hero_list_json)
#print(s)
#f = get_cname_skin_name(s)
#print(f)
def get_hero_skin(cname_url_list,cname_skin_name):#传入名称对应【皮肤名称列表】的字典和名称对应皮肤url列表的字典
 # """获取每个英雄的图片"""
 for cname,skin_url in cname_url_list.items():
 
 if mkdir(skin_base_dir+cname):#创建指定目录
  os.chdir(skin_base_dir+cname) #进入到创建的目录
  
  for i in range(len(skin_url)):
  file_name = cname_skin_name[cname][i]+'.jpg'
  r = requests.get(skin_url[i])
  with open(file_name,'wb') as f:
   f.write(r.content)
#创建目录
def mkdir(path):
 # 引入模块
 import os
 # 去除首位空格
 path=path.strip()
 # 去除尾部 \ 符号
 path=path.rstrip("\\")
 # 判断路径是否存在
 # 存在 True
 # 不存在 False
 isExists=os.path.exists(path)
 # 判断结果
 if not isExists:
 # 如果不存在则创建目录
 # 创建目录操作函数
 os.makedirs(path)
 print(path+' 创建成功')
 return True
 else:
 # 如果目录存在则不创建,并提示目录已存在
 print(path+' 目录已存在')
 return False
 return 
if __name__ == '__main__':
 
 hero_list_body = requests.get(hero_list_url) #请求英雄列表
 hero_list_json = hero_list_body.json() #将英雄列表的获取的json数据转换为python对象
 cname_ename = {} #英雄名称对应英雄编号的字典
 cname__skin_name = {} #英雄名称对应皮肤名称字符串的字典
 cname_skin_count = {} #英雄名称对应皮肤数量的字典
 
 cname_skin_name_str_list = get_skin_name(hero_list_json)
 cname_skin_name_list = get_cname_skin_name(cname_skin_name_str_list)
 cname_skin_count = get_hero_skin_count(cname_skin_name_str_list)
 cname_ename = get_ename(hero_list_json)
 cnam_skin_url_list = get_skin_name_url(hero_skin_root_url,cname_skin_count,cname_ename)
 get_hero_skin(cnam_skin_url_list,cname_skin_name_list)

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

用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例

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

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

这篇用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现class对象转换成json/字典的方法
Mar 11 Python
Python学生成绩管理系统简洁版
Apr 05 Python
Python多线程编程之多线程加锁操作示例
Sep 06 Python
分析经典Python开发工程师面试题
Apr 08 Python
用python做游戏的细节详解
Jun 25 Python
pandas数据筛选和csv操作的实现方法
Jul 02 Python
python读写csv文件并增加行列的实例代码
Aug 01 Python
Django框架中序列化和反序列化的例子
Aug 06 Python
python 伯努利分布详解
Feb 25 Python
python序列类型种类详解
Feb 26 Python
python将音频进行变速的操作方法
Apr 08 Python
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
May 28 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
Dec 14 #Python
python编程通过蒙特卡洛法计算定积分详解
Dec 13 #Python
Python编程产生非均匀随机数的几种方法代码分享
Dec 13 #Python
windows下Virtualenvwrapper安装教程
Dec 13 #Python
python实现机械分词之逆向最大匹配算法代码示例
Dec 13 #Python
Python语言描述KNN算法与Kd树
Dec 13 #Python
Python xlwt设置excel单元格字体及格式
Apr 18 #Python
You might like
动态新闻发布的实现及其技巧
2006/10/09 PHP
可以在线执行PHP代码包装修正版
2008/03/15 PHP
php实现cookie加密的方法
2015/03/10 PHP
Yii2创建多界面主题(Theme)的方法
2016/10/08 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
JavaScript使用prototype定义对象类型
2007/02/07 Javascript
js 时间格式与时间戳的相互转换示例代码
2013/12/25 Javascript
浅析Javascript中bind()方法的使用与实现
2016/04/29 Javascript
10分钟掌握XML、JSON及其解析
2020/12/06 Javascript
jQuery居中元素scrollleft计算方法示例
2017/01/16 Javascript
SVG描边动画
2017/02/23 Javascript
微信小程序使用radio显示单选项功能【附源码下载】
2017/12/11 Javascript
Angular利用内容投射向组件输入ngForOf模板的方法
2018/03/05 Javascript
分享5个好用的javascript文件上传插件
2018/09/16 Javascript
微信小程序时间控件picker view使用详解
2018/12/28 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
2019/02/28 Javascript
vue-cli配置flexible过程详解
2019/07/04 Javascript
javascript的惯性运动实现代码实例
2019/09/07 Javascript
基于 Vue 的 Electron 项目搭建过程图文详解
2020/07/22 Javascript
[00:29]2019完美世界全国高校联赛(秋季赛)总决赛海口落幕
2019/12/10 DOTA
基于python(urlparse)模板的使用方法总结
2017/10/13 Python
Python实现多进程共享数据的方法分析
2017/12/04 Python
基于Python Numpy的数组array和矩阵matrix详解
2018/04/04 Python
Python中的单行、多行、中文注释方法
2018/07/19 Python
Python中关键字global和nonlocal的区别详解
2018/09/03 Python
django数据库自动重连的方法实例
2019/07/21 Python
python实现图片中文字分割效果
2019/07/22 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
2020/07/09 Python
法国时尚童装网站:Melijoe
2016/08/10 全球购物
西班牙英格列斯百货官网:El Corte Inglés
2016/09/25 全球购物
大学学风建设方案
2014/05/04 职场文书
总经理助理岗位职责
2015/01/31 职场文书
2016公司年会通知范文
2015/04/25 职场文书
2015年度个人业务工作总结
2015/04/27 职场文书
解决tk mapper 通用mapper的bug问题
2021/06/16 Java/Android