正厚软件测试吧 关注:17贴子:166
  • 5回复贴,共1

王老师教你10行Python代码抓取王者荣耀全英雄皮肤

只看楼主收藏回复

今天给大家介绍一下如何使用python语言实现简单的网络爬虫,最终只用10行代码就可以完成王者荣耀全英雄皮肤的获取。整个过程一共分为三步,涉及到的python知识点有:基本语法,request库中的请求和响应方法,文件夹和文件创建方法。
第一步:找到英雄皮肤地址
首先进入王者荣耀官网:https://pvp.qq.com/ 在官网中查看英雄资料

英雄资料页面展示了所有英雄的信息,我们随便选择一个英雄头像点击查看其皮肤

在该页面可以看到该英雄的所有皮肤

那么如何获取这些图片地址呢,我们先通过浏览器的开发者工具来查看该页面,点击F12就可以打开该界面,在该界面可以看到资源图片的URL请求。一个网页中有很多资源,我们要找的英雄的皮肤背景图应该是一张大图,bigskin是我们要找的,点击左边的bigskin.jpg,右边显示了该图片的URL请求地址,注意别选成了下面2个smallskin的小图:

如果不知道选哪张图片还可以通过点击左边的元素定位按钮然后点击背景图片,也可以查看该元素的链接地址:

找到URL地址后,复制到浏览器,看下能否打开:
https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/523/523-bigskin-1.jpg
可以看到打开了该图片


IP属地:湖北1楼2020-01-10 17:22回复
    第二步:获取所有皮肤图片地址
    通过查看其他英雄的皮肤URL地址,我们会发现地址前面都是固定的,唯一不同就是info后面的参数,
    不同英雄的数字序号不同,每个英雄的皮肤序号也不同。
    那我们怎么知道每个英雄的序号和皮肤号呢?我们回到第一步中的英雄列表页面打开F12工具查看,在F12页面按下F5刷新,可以看到页面返回的XHR资源里面有一个herolist.json的资源,在浏览器中打开该链接可以下载出该JSON文件:

    查看该文件,可以分析出里面的ename就是英雄对应的序号,cname是英雄名,skin_name就是英雄对应的皮肤名字,序号从1开始:

    我们现在已经知道每个英雄的皮肤对应的URL地址是多少了,可以用python语言开始我们的爬虫工作了。
    导入requests和json库,使用request中的get方法获取数据,然后转换成json格式:

    可以看到返回的json格式结果是一个列表list,列表中的元素都是字典数据,每一个字典代表一个英雄数据,列表的长度98说明一共有98个英雄:

    下面我们要拼装每个英雄的皮肤图片的URL地址:

    拼接地址的过程稍微有点麻烦:首先在英雄列表中按英雄名进行循环,然后每次循环中再根据该英雄的皮肤进行循环,最后就可以获得全英雄的所有皮肤地址。


    IP属地:湖北2楼2020-01-10 17:26
    回复
      第三步:将图片保存到本机上
      整个爬虫过程其实很简单,就是为每个英雄创建文件夹,然后在文件夹中创建每个英雄的皮肤图片,首先在每一次循环时创建一个以英雄名命名的文件夹,然后进入该文件夹生成文件:

      最后一步就是生成图片文件了,可以用request中响应结果的content方法获取该图片的码流,然后用open方法创建该图片文件:

      附上完整的源代码和成果:
      不算导入包的3行,一共就10行代码:
      import requests
      import json
      import os
      url = 'https://pvp.qq.com/web201605/js/herolist.json'
      res = requests.get(url) # 爬取数据,将返回对象保存
      jst = res.json() # 将返回结果保存为json格式的数据
      jpg_url = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/'
      for i in range(len(jst)):
      os.mkdir("C:\\Skin\\" + jst[i]['cname']) # 在指定路径下新建一个以英雄名命名的文件夹
      os.chdir("C:\\Skin\\" + jst[i]['cname']) # 进入刚才创建的文件夹
      for j in range(len((jst[i]['skin_name']).split('|'))):
      herolink = jpg_url+str(jst[i]['ename'])+'/'+str(jst[i]['ename'])+'-bigskin-'+str(j+1)+'.jpg'
      open(str(jst[i]['skin_name'].split('|')[j]) + '.jpg', 'wb').write(requests.get(herolink).content)




      最后要注意的就是代码中对有些异常情况没有进行处理,比如文件夹不存在、json响应数据中缺少skin_name字段等。有兴趣的小伙伴可以自己试试处理这些异常。


      IP属地:湖北3楼2020-01-10 17:31
      回复
        最后的代码中两个for循环由于贴吧格式显示有误导致没有递进


        IP属地:湖北4楼2020-01-11 09:29
        回复
          收藏了


          来自Android客户端5楼2020-01-13 10:42
          回复
            哇 感觉讲的好细好全 我居然一步步看完啦


            来自iPhone客户端6楼2020-01-13 10:45
            回复