王者荣耀你们都玩过吧,没玩过的也应该据说过,做为时下最火的手机MOBA游戏,咳咳,好像跑题了。咱们今天的重点是爬取王者荣耀全部英雄的全部皮肤,并且仅仅使用20行Python代码便可完成。 文中源代码在文章末尾,可自行复制粘贴。html
爬取皮肤自己并不难,难点在于分析,咱们首先得获得皮肤图片的url地址,话很少说,咱们立刻来到王者荣耀的官网: python
咱们点击英雄资料,而后随意地选择一位英雄,接着F12打开调试台,找到英雄原皮肤的图片地址: web
接着,咱们切换一下英雄的皮肤,会发现图片地址没有明显的变化,只是最后的数字序号改变了,咱们将两个皮肤图片的地址放在一块儿比较一下:json
http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/523/523-bigskin-1.jpg http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/523/523-bigskin-2.jpg
咱们能够猜想,对于同一个英雄的皮肤图片地址,仅仅是最后的数字序号不一样,为了证明咱们的猜测,咱们能够继续找出一个英雄的全皮肤图片,找一个皮肤多一点的,例如我这里找的是孙尚香,将它的全部皮肤图片地址放在一块儿比较:浏览器
http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/111/111-bigskin-1.jpg http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/111/111-bigskin-2.jpg http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/111/111-bigskin-3.jpg http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/111/111-bigskin-4.jpg http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/111/111-bigskin-5.jpg http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/111/111-bigskin-6.jpg http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/111/111-bigskin-7.jpg
由此咱们得出结论,同一个英雄的皮肤图片路径从1开始依次递增,咱们再来看看不一样英雄之间是如何区分的。会发现,无论皮肤图片如何改变,浏览器上方的地址始终是不变的,因此咱们将两个不一样英雄的url地址放到一块儿比较一下:网络
https://pvp.qq.com/web201605/herodetail/523.shtml https://pvp.qq.com/web201605/herodetail/111.shtml
乍一看,彷佛没有什么规律,但咱们要从这里发现一点,就是最后的数字其实控制的是哪一个英雄,咱们暂且认为它是英雄的编号,可不幸的是,英雄编号之间好像没有什么规律,不用着急,咱们再到官网上找找线索。函数
在英雄资料界面,咱们打开F12调试台,经过抓取网络请求,我发现了几个文件: 学习
点击网络,而后点击XHR
,就能够看到这几个文件,看到文件的名字你们应该就清楚了,这些文件存储的就是英雄列表信息,咱们点击查看一下: 在这里插入图片描述 没错,这里存储的就是英雄信息,包括英雄的名字,英雄编号等等其它信息,咱们能够试试这些信息的准确性,例如小乔的ename,也就是英雄编号为106,因此按照以前的想法,英雄小乔的详情地址应为:https://pvp.qq.com/web201605/herodetail/106.shtml 通过尝试后发现确实如此。测试
到这里,准备工做就完成了,其实进行到这里,整个工程就完成了一半了,接下来就是代码的实现了。jsonp
首先咱们建立一个Python
文件,而后导入os
和requests
模块。 按照前面的步骤,咱们首先须要获取到英雄列表信息,也就是herolist.json
文件,文件地址为:https://pvp.qq.com/web201605/js/herolist.json,这在调试台中能够找到。 那么咱们首先就要经过这个地址获取到英雄列表信息的json数据,而后解析json数据,将有用的信息提取出来:
url = 'https://pvp.qq.com/web201605/js/herolist.json' herolist = requests.get(url) # 获取英雄列表json文件 herolist_json = herolist.json() # 转化为json格式 hero_name = list(map(lambda x: x['cname'], herolist.json())) # 提取英雄的名字 hero_number = list(map(lambda x: x['ename'], herolist.json())) # 提取英雄的编号
这样咱们就获取到了英雄名字和编号,能够输出测试一下: 拿到了英雄编号以后,事情就变得很简单了,只需拼接一下url地址便可: http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/' + hero_number + '/' + hero_number + '-bigskin-1.jpg
,这样能够获取到全部英雄的皮肤图片了,可是这里会有一个问题,英雄的皮肤是有多有少的,有的英雄只有两个皮肤,有的却有六七个,因此图片编号的最大值咱们并不清楚,这里我采用了一个比较笨的办法,就是让一个变量从1到10依次递增去拼接图片地址,若是遇到没有的图片咱们就不处理,由于没有一个英雄的皮肤超过了10个,因此咱们就能获取到全部的图片了。下面看代码实现:
# 下载图片 def downloadPic(): i = 0 for j in hero_number: # 建立文件夹 os.mkdir("C:\\Users\\Administrator\\Desktop\\wzry\\" + hero_name[i]) # 进入建立好的文件夹 os.chdir("C:\\Users\\Administrator\\Desktop\\wzry\\" + hero_name[i]) i += 1 for k in range(10): # 拼接url onehero_link = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/' + str(j) + '/' + str( j) + '-bigskin-' + str(k) + '.jpg' im = requests.get(onehero_link) # 请求url if im.status_code == 200: open(str(k) + '.jpg', 'wb').write(im.content) # 写入文件
实现很是地简单,代码注释也已经写得很清楚了,有了这个函数以后,咱们只需调用一下,就能够下载图片了,整个程序的完整代码以下:
import os import requests # python0基础小白加群:456926667,获取更多的python练手项目、练习,以及学习交流。 url = 'https://pvp.qq.com/web201605/js/herolist.json' herolist = requests.get(url) # 获取英雄列表json文件 herolist_json = herolist.json() # 转化为json格式 hero_name = list(map(lambda x: x['cname'], herolist.json())) # 提取英雄的名字 hero_number = list(map(lambda x: x['ename'], herolist.json())) # 提取英雄的编号 # 下载图片 def downloadPic(): i = 0 for j in hero_number: # 建立文件夹 os.mkdir("C:\\Users\\Administrator\\Desktop\\wzry\\" + hero_name[i]) # 进入建立好的文件夹 os.chdir("C:\\Users\\Administrator\\Desktop\\wzry\\" + hero_name[i]) i += 1 for k in range(10): # 拼接url onehero_link = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/' + str(j) + '/' + str( j) + '-bigskin-' + str(k) + '.jpg' im = requests.get(onehero_link) # 请求url if im.status_code == 200: open(str(k) + '.jpg', 'wb').write(im.content) # 写入文件 downloadPic()
除去注释,接近20行的代码咱们就完成了王者荣耀全英雄皮肤的爬取,是否是很是简单呢?咱们能够测试一下这个程序,首先要在桌面上建立一个文件夹,名为wzry,由于这里的代码我已经写死了,若是要修改的话你们也能够进行修改,文件夹建立完成后点击运行便可,等待片刻,图片就所有下载完成了。
对于程序中json字符串的解析,咱们还可使用jsonpath模块来进行,使用该模块可以更加快捷地获取到咱们想要的信息,解析方式以下:
hero_name = jsonpath.jsonpath(html_json, "$..cname") hero_number = jsonpath.jsonpath(html_json, "$..ename")
该方法接收一个json字符串和解析规则,$…cname则表示从根目录下找寻任意位置的以cname为键的值,并放入字典中。 结尾
爬虫是很是有趣的,由于它很是直观,视觉冲击感强,写出来也颇有成就感,爬虫虽然强大,但千万不能随意爬取隐私信息。
最后,若是对文中程序有更好的建议,欢迎评论区留言。