python网络图片下载—跟我一起爬王者农药皮肤吧
开工前介绍两句
1.环境:本文代码是在python 3.6的环境下编译的,用的是Mac电脑,Windows也可,用python3就可以了
2.工具:本文代码是在pycharm工具上编写的,也可以使用其他python编译器;还需要用到浏览器,随便一个都行,本文用的Mac自带的Safari浏览器。
3.目的:本文适合初学python的人,主要是学习爬取网络图片和存储的一些知识。
走,一起去爬王者农药的英雄皮肤吧!!!
开工
1.先打开我们的浏览器,百度“王者荣耀”,进入官网,找到如图所示:
点击英雄资料,进入下级界面,界面出来后,打开我们的“检查元素”,调用出页面检查器,选择网络,然后刷新一下界面,会看到很多资源,如下图所示:
找到一个叫herolist.json的玩意,然后右键“存储文件”,把这个json文件存到我们的电脑。因为这里面有所有英雄的信息。
2.我们点击任意一个英雄,进入下级页面。打开我们的页面检查器,如图:
我们比较会发现,皮肤大致分为两种类型,一种小图一种大图,想下哪个都行。那如何知道皮肤链接呢?右键我的其中一个.jpg,选择拷贝链接,粘贴出来,如:
http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/191/191-bigskin-2.jpg,
你可以再粘贴几个其他的,找找规律,如:
http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/191/191-bigskin-1.jpg,
http://game.gtimg.cn/images/yxzj/img201606/heroimg/191/191-smallskin-1.jpg,
http://game.gtimg.cn/images/yxzj/img201606/heroimg/191/191-smallskin-2.jpg。
我们对比发现,大图变化的是bigskin-后面的数字,因为这个英雄就俩皮肤,所以只有1和2,那么如果有6个皮肤嘞?那肯定就是1、2、3、4、5、6了。小图皮肤同理。那么这个191数字是啥嘞?我们打开之前下载的.json文件,找到大乔这个英雄
哈哈,原来191是大乔的ename值!我们大胆猜测其他英雄皮肤肯定就是换响应的代码即可!
(注:我这里是用Mac下的JSON Accelerator软件打开的,用文档打开也可以的)
3.撸代码!
1)打开我们的pycharm软件,新建一个.py文件(点工具栏File,选择New…,选择python file,快捷键cmd+n),起名叫农药皮肤.py吧!
2)导入我们今天要用到的三个模块:requests、json、urllib
3)代码打开我们之前下载的json文件,如下:
用于读取英雄资料信息
with open(r’/Users/yinchangfeng/Desktop/herolist.json’,’r’,encoding=’utf-8’) as ff:
# json_file是一个list,列表里又有字典
json_file = json.load(ff)
print(json_file)
这里打开文件我们用 with open() as f:这种方法,方便快捷,简单粗暴!那我们如果不知道下载的文件位置怎么办?找到我们刚浏览器的下载页,找到这个json文件,打开我们的控制台,把json文件往控制台拖,控制台会自动显示文件位置,复制粘贴即可。
我们这里打印出我们的json文件内容,我们也可以看一看这个json是啥类型的玩意:
print(type(json_file))
会发现他是个list,类似于oc中的array数组。
我们观察可以发现,每个英雄都有固定的数据格式:ename、cname、title、new_type、hero_type、skin_name。我们取出一些我们需要的信息:ename、cname、skin_name:
提取英雄的信息
for m in range(len(json_file)):
# 英雄数字名称
e_name = json_file[m]['ename']
# 英雄的中文名称
c_name = json_file[m]['cname']
# 英雄的皮肤名称
skin_name = json_file[m]['skin_name'].split('|')
# 计算每个英雄有多少皮肤
skin_number = len(skin_name)
print(e_name, c_name, skin_name, skin_number)
这里用到切割方法split(),因为皮肤名字是连在一起的,用|分割的,所以我们要根据“|”将我们的皮肤分割开来成一个个list。
接下来就是获取皮肤了:
获取图片
for n in range(0, skin_number):
picture_url = 'http://game.gtimg.cn/images/yxzj/web201606/skin/hero-info/' + str(e_name) \
+ '/'+ str(e_name) +'-bigskin-' + str(n+1) + '.jpg'
# 获取图片并返回二进制数据
# pictur = requests.get(picture_url).content
picture = requests.request('GET',picture_url).content
# 写入文件的几种方法
# NO.1 写入图片到本地
# with open('/Users/yinchangfeng/Desktop/Pictures/' + c_name + skin_name[n-1] + '.jpg', 'wb') as f:
# f.write(picture)
# NO.2
# f = open()
# f.write()
# f.close()
# NO.3
urllib.request.urlretrieve(picture_url, '/Users/yinchangfeng/Desktop/Pictures/' + c_name + skin_name[n] + '.jpg')
此处的注意点是:
①皮肤名不是从0开始的,我们的rang是从0开始,所以在拼接的时候n要+1,这样才能取到对应的皮肤,或者采用我结尾的另一种方法也可以,rang起始位加1也行;
②存储有三种方法,第一种跟我们前面一样用 with open() as f: 这样的,第二种用最常见的三步式,第三种用urllib中的快捷方法,能直接请求并储存我们的二进制文件到本地;
③请求也有两种方法,一种是requests.get方法,一种是requests.request方法;
④储存前,要自己在桌面或者其他位置新建一个文件夹,我这里新建在桌面,叫Pictures。
完成以上所有步骤后,我们运行,跑起来,打开我们的Pictures文件夹会发现图片在不断的写入哦!最终如图所示:
最后附上完整代码:
=============我是分割线=================
!/usr/bin/env python3.6
-- coding: UTF-8 --
@author : Yin Changfeng
@File : 农药皮肤.py
@time : 2018/3/9 上午10:49
@license: Copyright(C), 国元网金
@desc : 获取网页数据并创建文件夹保存(基于python3.6)
import requests
import json
import urllib # 应用于文件储存
用于读取英雄资料信息
with open(r’/Users/yinchangfeng/Desktop/herolist.json’,’r’,encoding=’utf-8’) as ff:
# json_file是一个list,列表里又有字典
json_file = json.load(ff)
print(json_file)
# 提取英雄的信息
for m in range(len(json_file)):
# 英雄数字名称
e_name = json_file[m][‘ename’]
# 英雄的中文名称
c_name = json_file[m][‘cname’]
# 英雄的皮肤名称
skin_name = json_file[m][‘skin_name’].split(‘|’)
# 计算每个英雄有多少皮肤
skin_number = len(skin_name)
print(e_name, c_name, skin_name, skin_number)
# 获取图片
for n in range(1, skin_number+1):
picture_url = ‘http://game.gtimg.cn/images/yxzj/web201606/skin/hero-info/’ + str(e_name) \
+ ‘/’+ str(e_name) +’-bigskin-’ + str(n) + ‘.jpg’
# 获取图片并返回二进制数据
# pictur = requests.get(picture_url).content
picture = requests.request(‘GET’,picture_url).content
# 写入文件的几种方法
# NO.1 写入图片到本地
# with open(‘/Users/yinchangfeng/Desktop/Pictures/’ + c_name + skin_name[n-1] + ‘.jpg’, ‘wb’) as f:
# f.write(picture)
# NO.2
# f = open()
# f.write()
# f.close()
# NO.3
urllib.request.urlretrieve(picture_url, '/Users/yinchangfeng/Desktop/Pictures/' + c_name + skin_name[n-1] + '.jpg')