这是我自学python以来的第一篇博文,自学python其实不难,但不可避免的也踩过很多坑,所以这里我尽量地详细介绍爬取和解析的过程,希望能给初学者带来帮助!

  • 皮肤图片来源

因为官网没有直接的英雄皮肤接口,所以我们这里从 http://pvp.qq.com/ 的 “英雄资料”进入所有英雄列表, 选择一个英雄(以第一个英雄 沈梦溪 为例),进去该英雄资料页面 http://pvp.qq.com/web201605/herodetail/312.shtml ,可以看到皮肤资料

  • 审查元素

按F12审查皮肤元素可以看到皮肤图片地址 //game.gtimg.cn/images/yxzj/img201606/skin/hero-info/312/312-bigskin-1.jpg ,但进源码中你是看不到这个地址的,所以抓源码是不可行的。但你如果多审查几个皮肤元素,就会发现这个网址就两个变量“312”和“1”。

1、 “312”曾出现在该网页的url中 http://pvp.qq.com/web201605/herodetail/312.shtml ,每个英雄的url这个值是变动的,很显然,这就是英雄的id。在所有英雄列表中审查单个英雄元素,可以很轻松的看到英雄id。

但查看源码你又会发现什么也没有,应该是后台传输的数据,所以我重新加载一下在F12的网络中找后台加载的数据,找到了herolist.json这个文件。

这样的文件右击在新窗口打开,会直接下载在本地,内容如下:

这里ename不难发现就是英雄id,cname是英雄,skin_name就是皮肤,我们取这三个数据即可,herolist.json的网址是 http://pvp.qq.com/web201605/js/herolist.json 。

2、沈梦溪就两个皮肤,第一个爆弹怪猫的皮肤地址 :
//game.gtimg.cn/images/yxzj/img201606/skin/hero-info/312/312-bigskin-1.jpg
第二个棒球奇才的皮肤地址:
//game.gtimg.cn/images/yxzj/img201606/skin/hero-info/312/312-bigskin-2.jpg
很明显,这里的“1”或者“2”只是皮肤的序号而已,取决于皮肤的数量,这里抓取皮肤名称即可。

  • 代码逻辑

如上分析,我们思路如下:
1、获取英雄信息:从 http://pvp.qq.com/web201605/js/herolist.json 网址获取英雄名称、id、皮肤名称;
2、获取单个英雄所有皮肤:遍历皮肤名称,英雄id与皮肤序号一起组建皮肤url,发送请求,响应写入文件;
3、获取所有英雄皮肤:遍历英雄,创建文件夹。

def get_heroinfo():passdef save_skinimg():passdef main():if not os.path.exists(os.path.join(os.getcwd(), '皮肤')):os.mkdir('皮肤')os.chdir('皮肤')passif __name__ == "__main__":main()
  • 代码实现

1、获取英雄信息
目标:所有英雄的名称、id、皮肤名称
值得一提的是,解析内容我这里用的是正则,其实也可以用json.loads()转成字典来解析,但正则貌似比较直接。
另外,经过尝试,所有英雄页面的herolist.json不是唯一包含英雄id信息的文件,在单个英雄资料页面,后台你同样可以抓到一个名为heroid.js的文件,也包含id信息,但没有皮肤信息,如果后面图片要以皮肤名称命名的话,就还要从该网页抓取皮肤信息。

def get_heroinfo():url = 'http://pvp.qq.com/web201605/js/herolist.json'response = requests.get(url, headers=headers).text# 匹配英雄信息(id,英雄名称,皮肤名称),形成元组组成的列表hero_infos = re.findall('"ename":(\d+),"cname":"(\S+?)".*?skin_name":"(.*?)"', response)return hero_infos

2、获取单个英雄所有皮肤
目标:写单个英雄的图片文件
第一步我们得到的是一个列表hero_infos,里面的hero_info包含一个英雄的名称、id和皮肤名称,接下来我们就拿来组建图片地址,hero_info[0]是id,hero_info[1]是英雄的名字,hero_info[2]是皮肤的名字,但这是几个皮肤名字组合在一起的字符串,格式是

"魅惑之狐|女仆咖啡|魅力维加斯|仙境爱丽丝|少女阿狸|热情桑巴"

所以这里需要切片成列表,然后遍历皮肤,计算皮肤序号num,而皮肤名称的作用仅仅是用来命名的。所以如果你没有命名要求,完全可以不抓取它,妲己的皮肤已经算多的了,我们完全可以从1遍历到10(有10个皮肤的英雄吗……),用try……except来结束异常的遍历,图片命名直接取链接切片后的.jpg部分,这样无疑更省事(八大浪费之加工过剩浪费……),所以代码都是根据需求来写的。

def save_skinimg(hero_info):num = 1# 处理皮肤名称中的“|”skin_names = hero_info[2].split('|')for skin in skin_names:url = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{}/{}-bigskin-{}.jpg'.format(hero_info[0], hero_info[0], num)num += 1response = requests.get(url, headers=headers).contentfilename = '{}-{}.jpg'.format(hero_info[1], skin)print('正在下载 {}……'.format(filename))with open(filename, 'wb') as f:f.write(response)

3、获取所有英雄皮肤
目标:主函数……创建文件的保存路径,遍历所有英雄
调用前面两函数,实现所有英雄的皮肤下载

def main():if not os.path.exists(os.path.join(os.getcwd(), '皮肤')):os.mkdir('皮肤')os.chdir('皮肤')# 获取英雄信息(id,英雄名称,皮肤名称)hero_infos = get_heroinfo()for hero_info in hero_infos:# 打开图片链接并保存图片save_skinimg(hero_info)
  • 代码总览

好了,代码基本上就这样,整合在一起看看

import requests, re, os
from lxml import etreedef get_heroinfo():url = 'http://pvp.qq.com/web201605/js/herolist.json'response = requests.get(url, headers=headers).text# 匹配英雄信息(id,英雄名称,皮肤名称),形成元组组成的列表hero_infos = re.findall('"ename":(\d+),"cname":"(\S+?)".*?skin_name":"(.*?)"', response)return hero_infosdef save_skinimg(hero_info):num = 1# 处理皮肤名称中的“|”skin_names = hero_info[2].split('|')for skin in skin_names:url = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{}/{}-bigskin-{}.jpg'.format(hero_info[0], hero_info[0], num)num += 1response = requests.get(url, headers=headers).contentfilename = '{}-{}.jpg'.format(hero_info[1], skin)print('正在下载 {}……'.format(filename))with open(filename, 'wb') as f:f.write(response)def main():if not os.path.exists(os.path.join(os.getcwd(), '皮肤')):os.mkdir('皮肤')os.chdir('皮肤')# 获取英雄信息(id,英雄名称,皮肤名称)hero_infos = get_heroinfo()for hero_info in hero_infos:# 打开图片链接并保存图片save_skinimg(hero_info)if __name__ == "__main__":headers = {'User-Agent': 'Opera/9.27 (Windows NT 5.2; U; zh-cn)'}main()

总共36行,含注释和空行,代码很简单,关键就是抓这个json!
ok,最后附上一段它的姊妹篇 - 王者荣耀高清壁纸下载,因为没抓到后台数据,所以只能用selenium+Chrome,这里用了递归。

from selenium import webdriver
from lxml import etree
import time, requests, osdef get_imglink():global itime.sleep(3)content = driver.page_sourcehtml = etree.HTML(content)links = html.xpath('//div[@id="Work_List_Container_267733"]//li[@class="sProdImgDown sProdImgL6"]/a/@href')print('正在获取第 %d 壁纸link列表……' % i)for link in links:response = requests.get(link, headers=headers)time.sleep(1)filename = link.split('/')[-2]with open(filename, 'wb') as f:f.write(response.content)driver.find_element_by_xpath('//a[@href="javascript:Work_267733.Page(1,0);"] | //a[@href="javascript:Work_267733.Page(1, 0);"]').click()driver.switch_to.default_content()i += 1try:get_imglink()except Exception as e:print(e)driver.close()driver = webdriver.Chrome()
imglinks = []
start_url = 'http://pvp.qq.com/web201605/wallpaper.shtml###'
driver.get(start_url)
i = 1
headers = {'User-Agent':'Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en) Opera 8.0','Referer':'http://pvp.qq.com/web201605/wallpap'}
if not os.path.exists(os.path.join(os.getcwd(), '壁纸')):os.mkdir('壁纸')
os.chdir('壁纸')
get_imglink()
  • 效果展示

壁纸好多就是皮肤来着,腾讯好偷懒……


^ _ ^ 对于文章和代码,有什么问题或建议,欢迎与我联系,谢谢~

王者荣耀英雄皮肤官方高清图片爬虫相关推荐

  1. 图片链接用src不能被爬虫爬到吗_爬虫:带你一键爬取王者荣耀英雄皮肤壁纸

    一.前言 王者荣耀这款手游,想必大家都玩过或听过,游戏里英雄有各式各样的皮肤,制作得很精美,有些拿来做电脑壁纸它不香吗.本文带你利用Python爬虫一键下载王者荣耀英雄皮肤壁纸. 1. 目标 创建一个 ...

  2. 教你用python爬取王者荣耀英雄皮肤图片,并将图片保存在各自英雄的文件夹中。(附源码)

    教你用python爬取王者荣耀英雄皮肤图片,并将图片保存在各自英雄的文件夹中.(附源码) 代码展示: 保存在各自的文件夹中 美么? 让我们开始爬虫之路 开发环境 windows 10 python3. ...

  3. python 山脊图_爬虫:带你一键爬取王者荣耀英雄皮肤壁纸

    一.前言 王者荣耀这款手游,想必大家都玩过或听过,游戏里英雄有各式各样的皮肤,制作得很精美,有些拿来做电脑壁纸它不香吗.本文带你利用Python爬虫一键下载王者荣耀英雄皮肤壁纸. 1. 目标 创建一个 ...

  4. Python爬虫——手把手教你爬取王者荣耀英雄皮肤

    大家好!我是霖hero 大家知道目前最火的手游是哪个嘛,没错,就是王者荣耀,这款手游想必大家都听过或者玩过吧,里面有106个英雄,几百个英雄皮肤,今天我来手把手教你们把几百个皮肤都爬取下来. 目录 P ...

  5. Python爬取 | 王者荣耀英雄皮肤海报

    这里只展示代码,具体介绍请点击下方链接. Python爬取 | 王者荣耀英雄皮肤海报 import requests import re import os import time import wi ...

  6. python爬取王者皮肤_Python爬取王者荣耀英雄皮肤高清图片

    前言 临下班前,看到群里有人在讨论用王者农药的一些皮肤作为电脑的壁纸,什么高清的,什么像素稍低的,网上查了一手,也有,但像素都不一样,所以,我就想着,自己去官网直接爬他的高清皮肤就好了,然后就有了这边 ...

  7. 获取王者荣耀皮肤所有高清图片-Python

    参考:https://blog.csdn.net/yaoyefengchen/article/details/78813477 获取王者荣耀所有高清图片,通过Phtyon很简单能实现. 我最喜欢的李白 ...

  8. Python爬虫基础--爬取王者荣耀英雄皮肤图片

    文章目录 思路分析 涉及到的知识点 Json数据说明 `herolist.json`:英雄列表 皮肤图片尺寸分析 程序说明 代码 结果(数据)分析 声明 这里只是简单介绍主要内容,详见github,仓 ...

  9. 如何将浏览器中百度页面的皮肤作为高清图片下载

    打开浏览器,切换到百度后,点击百度首页,点击设置,点击换肤,选择自己喜欢的皮肤 更换完自己想要的皮肤后,可以用鼠标右键或者Ctrl+Shift+I快捷键打开检查,应该会出现一以下界面. 点击Sourc ...

最新文章

  1. NC:港大张彤团队-基于组学的耐药基因风险评估框架
  2. 视频会议老走神?试试VR会议的真·沉浸式体验!HTC、IEEE纷纷试水,云开会也能拥抱、自拍...
  3. jQuery的入口函数
  4. python lambda函数详细解析(据说面试90%的人经常遇到)
  5. 常用HLS优化指令总结
  6. java组件代码_[java]常用组件
  7. Python_多元回归(一元回归)
  8. centeros7安装mysql
  9. 测试环境安装配置obproxy(社区版)
  10. Gnuplot的简介与常用操作
  11. 诊断Oracle 服从成绩
  12. Android之实现 A/B分区更新固件
  13. 02 Toolbar的使用
  14. 【转载】Unity3D导入FBX模型的相关属性介绍
  15. 明尼苏达计算机科学硕士录取案例,专业42-明尼苏达大学双城分校研究生录取-W同学...
  16. 爬虫爬取千万数据如何快速保存,看这里
  17. 鸡啄米:C++编程入门系列之目录和总结http://www.jizhuomi.com/software/129.html
  18. 软件著作权(软著)申请之六大坑
  19. 深度学习电脑硬件配置
  20. 求一个n阶方阵对角线元素之和

热门文章

  1. 【Scratch-外观模块】像素化特效指令
  2. 私有化短链接管理系统-魔众短链接系统 v1.0.0
  3. java 登陆短信验证码_Java实现短信验证码
  4. mysql 与sqlserver对比?哪个更好用?
  5. 这个电脑用显微镜才能看清:却能让假货无处遁形
  6. 炉石一直显示连接服务器,炉石传说无法连接战网服务器怎么办 处理方法详解...
  7. 邀请函首页制作过程介绍
  8. 做网站不买服务器百度能搜到,做网站教程:哪几种链接是不会被百度抓取的
  9. 信奥中的数学 相关资料汇总(2022.07.08)
  10. 公路广告牌问题(Highway Billboard Problem)--动态规划