Python爬取王者荣耀英雄的皮肤数据,并下载皮肤图片!高清的图片用来做桌面也不错哟~

网址:https://pvp.qq.com/web201605/herolist.shtml

1.获得英雄信息,并保存为json文件

1.1 使用requests爬取信息,requests模块爬取的是Network/Response下的静态数据。
首先获取网页的数据(有如下1.1和1.2两种方式),在此之前先了解xpath的使用:xpath是使用节点路径表达式来选取XML或HTML文档中的节点或节点集。常见的路径表达式如下

路径表达式 含义
/ 从根节点开始选取,也就是当前目录
// 从任意位置开始
. 当前目录
@ 选取属性
text() 获取某标签内的内容值

例如我们要获得百度首页右上方的文字“新闻”,它的表达式就是
//div[@id = 's-top-left']/a[1]/text()
任意位置的div,属性id的值为s-top-left,它里面的第一个a标签的内容值

json模板的2个常用方法

dump(obj,fp, ensure=True,indent=None) 将Python的基本数据类型序列化成字符串并写入到文件中。
load(obj) 读取文件中的字符串,转化成Python的基本数据类型。


使用requests模块爬取数据的代码如下:

import requests
import lxml.html
import os
import json
from fake_useragent import UserAgentdef parse_hero_url(http_url):#发送请求获取整个页面数据headers = {"User-Agent" : UserAgent().chrome #chrome浏览器随机代理}hero_r = requests.get(http_url,headers = headers)demo =  hero_r.content.decode('gbk')return demodef get_data(hero_url):#获取网页数据data = parse_hero_url(hero_url)#print(data)#获取etree对象metree = lxml.html.etree#获取解析器对象parse = metree.HTML(data)#开始解析hero_list = parse.xpath("//div[@class='herolist-content']/ul[@class='herolist clearfix']/li")print(len(hero_list))#查看我们爬取到几个英雄的信息#print(hero_list)list = []for li in hero_list:item = {}name = li.xpath("./a/text()")[0]#print(name)item['name'] = namesrc = "https:"+li.xpath("./a/img/@src")[0]#print(src)item['src'] = srchref_url = "https://pvp.qq.com/web201605/"+li.xpath("./a/@href")[0]#print(href_url)item['href_url'] = href_url#print(item)list.append(item)
#         print(list)return list#保存文件
def save_file_json(datas):#如果路径不存在,则创建path_name = './hero'   if not os.path.exists(path_name):os.makedirs(path_name)print('目录[%s]保存英雄信息创建成功!'%path_name)#保存数据with open(path_name+'/hero.json', 'w',encoding='utf-8') as f:json.dump(datas, f,ensure_ascii=False,indent=2)print('英雄数据保存成功,谢谢!')
if __name__ == '__main__':hero_data = get_data('https://pvp.qq.com/web201605/herolist.shtml')#print(hero_data)#保存为json格式save_file_json(hero_data)

结果如下:

发现我们只爬到93个英雄的信息,而现在王者荣耀官网共有99个英雄。说明使用requests模块爬取到的数据不完整。

1.2 使用selenium模块直接爬取动态数据
要使用selenium模块,就要下载相应的浏览器驱动文件,并且要与自己的浏览器版本相对应。下载地址:
http://npm.taobao.org/mirrors/chromedriver/
我们一般使用selenium库的webdriver对象,使用pip下载selenium后可以先测试一下,看看是否可以驱动浏览器。注:Chrome_path 的路径是自己存放浏览器驱动文件的路径

from selenium import webdriver
#驱动浏览器
Chrome_path = r'D:/package/chromedriver_win32/chromedriver.exe'
webdriver.Chrome(Chrome_path)

使用selenium爬取数据代码如下

from selenium import webdriver
import lxml.html
import os
import json
import timedef parse_hero_url(http_url):# 获得浏览器对象pjs_path = r'D:/package/phantomjs-2.1.1-windows/bin/phantomjs.exe'browser = webdriver.PhantomJS(pjs_path)#PhantomJS是无界面化浏览器# 发送请求browser.get(http_url)time.sleep(2)  #延迟2秒# 详细提取数据  --获得网页源代码  page_sourcehero_html_content = browser.page_source#print(hero_html_content)# 关闭浏览器browser.quit()return hero_html_contentdef get_data(data):#获取etree对象metree = lxml.html.etree#获取解析器对象parse = metree.HTML(data)#开始解析hero_list = parse.xpath("//div[@class='herolist-content']/ul[@class='herolist clearfix']/li")print(len(hero_list))#查看我们爬取到几个英雄的信息#print(hero_list)list = []for li in hero_list:item = {}hero_name= li.xpath("./a/text()")[0]#print(hero_name)item['hero_name'] = hero_namehero_href_url = "https://pvp.qq.com/web201605/" + li_element.xpath("./a/@href")[0]#print(hero_href_url )item['hero_href_url '] = hero_href_url hero_image_url = "https:" + li_element.xpath(".//img/@src")[0]#print(hero_image_url )item['hero_image_url '] = hero_image_url #print(item)list.append(item)
#         print(list)return list#保存文件
def save_file_json(datas):#如果路径不存在,则创建path_name = './completehero'   if not os.path.exists(path_name):os.makedirs(path_name)print('目录[%s]保存英雄信息创建成功!'%path_name)#保存数据with open(path_name+'/completeherohero.json', 'w',encoding='utf-8') as f:json.dump(datas, f,ensure_ascii=False,indent=2)print('英雄数据保存成功,谢谢!')
def main():# 获得网页数据hero_url = "https://pvp.qq.com/web201605/herolist.shtml"# parse_hero_url(hero_url)hero_html_datas = parse_hero_url(hero_url)# print(hero_html_datas)# 提取数据hero_info_datas = get_data(hero_html_datas)# print(hero_info_datas)# 保存到文件中save_file_json(hero_info_datas)if __name__ == '__main__':main()

成功拿到99个英雄信息

保存的json文件数据

2.将英雄头像下载到本地


先了解一下文件的使用,比较经常使用的就是打开文件、关闭文件。
要对一个文件进行读写操作就要打开文件,可使用open()函数打开一个已经存在的文件或者在相应的目录下创建文件。open()将会返回一个file对象,基本语法:open(filename, mode),filename是文件的路径和文件名,mode是打开文件的模式。

#打开文件,写入内容
file = open("/python/data.txt", "w")
file .write( "哈哈哈哈哈哈哈" )
#关闭文件,一定要关闭文件
file.close()#读取数据
f = open("/python/data.txt", "r")
str = f.read()
print(str)
#关闭文件

要下载英雄的头像,先要读取前面保存的json文件,然后创建一个文件夹来存放图片,定一个函数来读取json数据,提取英雄名称,创建下载目录,导入os模块,判断目录是否存在,如果不存在就创建,然后遍历读取的json数据,代码如下

import requests
from fake_useragent import UserAgent
#import useragentutil
#获取json文件中的英雄数据的函数
def read_jsondata():file = open('./completehero/completehero.json','r',encoding='utf-8')return(json.load(file))#提取英雄名称,创建下载目录:./hero/pictures/名称  ----的函数
def create_img_name(data):#遍历for hero_element in data:#名称hero_name = hero_element.get('hero_name')#前缀before_dirname = './completehero/pictures'#拼接路径dirname = before_dirname+'/'+hero_name#print(dirname)#判断路径是否存在,不存在就创建if not os.path.exists(dirname):os.makedirs(dirname)#print("存放英雄(%s)图片的目录[%s]创建成功.."%(hero_name,dirname))#print("所有英雄的目录已经创建,谢谢")#下载图片
def download_picture(datas):#遍历返回的数据for hero_element in datas:#名称hero_name = hero_element["hero_name"]#图片地址image_url = hero_element['hero_image_url']#获取图片内容,写入到某个文件headers = {"User-Agent" : UserAgent().chrome #chrome浏览器随机代理}#image_response = requests.get(image_url,headers = headers)image_response = requests.get(image_url,headers = useragentutil.get_headers())#图片内容image_content = image_response.content#图片文件file = open('./completehero/pictures/'+hero_name+'/'+hero_name+'.jpg','wb')#图片属于二进制格式,用wbfile.write(image_content)file.close()print('英雄(%s)图片正在下载,请稍等...'%hero_name)print('所有英雄图片下载成功,谢谢!')def main():#获取json文件中的英雄数据jsondata = read_jsondata()  #jsondata是读取json文件返回的数据
#     print(jsondata)
#     print(type(jsondata))#提取英雄名称,创建下载目录:./hero/pictures/名称create_img_name(jsondata)#下载图片download_picture(jsondata)if __name__ == '__main__':main()

运行结果

图片

3.获取皮肤数据,并保存为json文件

json的{}相当于一个对象,[]相当于数组。多个皮肤对应一个数组,一个皮肤对应一个对象:[{皮肤1},{皮肤2},{皮肤3},···],多个英雄对应一个数组,一个英雄是一个对象[{英雄1},{英雄2},{英雄3},····],一个英雄有很多个皮肤,所以可以考虑json保存的数据样式为[{英雄1[{皮肤1},{皮肤2},{皮肤3},···]},{英雄2[{皮肤1},{皮肤2},{皮肤3},···]},{英雄3[{皮肤1},{皮肤2},{皮肤3},···]},····]
获取皮肤数据并保存的为completeheroskin.json的代码如下:

from selenium import webdriver def skin():skindata = read_jsondata()#print(skindata)#所有的英雄信息herodata = []for skin in skindata:#空字典---存放英雄hero_dict = {}#获得英雄名称hero_name = skin['hero_name']hero_dict['hero_name'] = hero_name
#         获得英雄链接skin_href = skin['hero_href_url']
#         print(skin_href)#请求信息skin_hero = response_urllist(skin_href)#[{'skin_name': '流云之翼', 'skin_url': 'https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/506/506-bigskin-1.jpg'}, {'skin_name': '荷鲁斯之眼', 'skin_url': 'https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/506/506-bigskin-2.jpg'}]#print("英雄[%s]的皮肤信息:"%hero_name,skin_hero)#把皮肤列表添加到对应的英雄中hero_dict['skin_hero_list'] = skin_hero#print(hero_dict)#添加到大列表herodata.append(hero_dict)#保存数据save_herodata(herodata)print("正在保存[%s]英雄的皮肤信息,请稍等!"%hero_name)print("所有英雄皮肤信息保存成功,谢谢!")def save_herodata(datas):#保存皮肤信息with open('./completehero/completeheroskin.json', 'w',encoding='utf-8') as f:json.dump(datas, f,ensure_ascii=False,indent=2)#获取英雄的皮肤信息
def response_urllist(list_url):#获得浏览器对象Chrome_path = r'D:/package/chromedriver_win32/chromedriver.exe'browser = webdriver.Chrome(Chrome_path)#发送请求 browser.get(list_url)#提取信息#获得皮肤的标签内容li_list = browser.find_elements_by_xpath("//div[@class = 'pic-pf']/ul/li")
#     print(len(li_list))#皮肤列表skin_info_list = []#遍历for li_element in li_list:#空字典--存放皮肤skin_dict = {}#获得皮肤名称skin_name = li_element.find_element_by_xpath("./p").text
#         print("皮肤名称:",skin_name)skin_dict['skin_name'] = skin_name#皮肤图片链接地址skin_url = "https:"+li_element.find_element_by_xpath(".//img").get_attribute("data-imgname")
#         print(skin_url) skin_dict['skin_url'] = skin_url
#         print(skin_dict)#添加到列表中skin_info_list.append(skin_dict)#关闭浏览器browser.quit()return skin_info_listif __name__ == '__main__':skin()

代码运行结果如下

completeheroskin.json数据

4.下载皮肤图片

from fake_useragent import UserAgent
import json,requests
#获取皮肤数据
def read_heroskin():skin_file = open('./completehero/completeheroskin.json','r',encoding='utf-8')skin_file_data = json.load(skin_file)#print(skin_file_data)return skin_file_datadef downskin():#1.读取保存的json皮肤数据heroskindata = read_heroskin()#print(heroskindata)i = 0while i < len(heroskindata):hero = heroskindata[i]#print("第%d个英雄:"%i,hero)#2. 遍历获取单个英雄数据,英雄名称,皮肤列表#英雄名称hero_name = hero.get("hero_name")skin_path = './completehero/pictures/'+hero_name#print("存放路径:",skin_path)#皮肤列表skin_list = hero.get("skin_hero_list")#print("皮肤列表:",skin_list)#3. 遍历皮肤列表,获得单个皮肤,名称,图片下载地址for skin_element in skin_list:#print(skin_element)#皮肤名称skin_name = skin_element['skin_name']#图片下载地址skin_url = skin_element['skin_url']#print("皮肤名称:%s,地址:%s"%(skin_name,skin_url))#4.通过图片地址下载皮肤图片#图片内容headers = {"User-Agent" : UserAgent().chrome #chrome浏览器随机代理}response = requests.get(skin_url,headers = headers)image_content = response.content#下载图片with open(skin_path+'/'+skin_name+'.jpg','wb') as f:f.write(image_content)print("正在下载英雄%s的皮肤图片,皮肤名称%s"%(hero_name,skin_name))print("已成功下载英雄%s得皮肤图片"%hero_name)i += 1print("所有英雄的皮肤图片均已下载完毕,谢谢")if __name__ == '__main__':downskin()


Python爬取王者荣耀英雄的皮肤数据并下载皮肤图片项目相关推荐

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

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

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

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

  3. python玩王者荣耀皮肤碎片怎么获得_大神教你用Python爬取王者荣耀英雄皮肤,不充钱也能入手!...

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

  4. 利用Python爬取王者荣耀英雄皮肤!

    image 0.引言 作为一款现象级游戏,王者荣耀,想必大家都玩过或听过,游戏里中各式各样的英雄,每款皮肤都非常精美,用做电脑壁纸再合适不过了.本篇就来教大家如何使用Python来爬取这些精美的英雄皮 ...

  5. python爬取王者皮肤别人可以看见效果吗_利用python爬取王者荣耀英雄皮肤图片

    前两天看到同学用python爬下来LOL的皮肤图片,感觉挺有趣的,我也想试试,于是决定来爬一爬王者荣耀的英雄和皮肤图片. 然后,简单的分析一下结构,看看是否有反爬机制. 之后,在上网查阅资料后,发现所 ...

  6. python爬取王者荣耀英雄的背景故事

    文章目录 前言 目标数据源分析 代码实现过程 1.代码框架 2.获取英雄编号及名称数据 3.获取英雄故事数据 完整代码 我只用了四个函数,<王者荣耀>就把每个英雄的背景故事递给了我 前言 ...

  7. Python爬取王者荣耀英雄图片及装备

    在玩王者荣耀的时候一直想把装备合英雄的图片保存下来,但是官网的单个图片保存太慢一气之下写了个爬虫. 1.爬取装备 import requests from bs4 import BeautifulSo ...

  8. python爬取王者荣耀英雄素材图案例

    import time import requests import threading from queue import Queue from urllib import parse import ...

  9. Python爬取王者荣耀全英雄台词语音及对应的文本

    文章目录 写在前面 环境 网页分析 爬虫代码实现及说明 写在前面 很久之前就萌生了想爬取王者荣耀英雄台词语音,因为语音资源不是很好找,从官网获得的话,也比较麻烦.最近刚好有朋友需要语音素材,于是我就顺 ...

最新文章

  1. AgileEAS.NET平台开发实例-药店系统-准备开发环境(上)
  2. MyBatis之使用JSONObject代替JavaBean优雅返回多表查询结果
  3. sqoop1.4.5 导入 hive IOException running import job: java.io.IOException: Hive exited with status 1
  4. java线程在什么时候结束,java – 什么时候线程超出范围?
  5. 机器人抓取方式,值得研究。
  6. 复制含有随机指针节点的链表~哈希表的使用~(⌒▽⌒)
  7. maftools|TCGA肿瘤突变数据的汇总,分析和可视化
  8. Windows 使用浮动键盘语言栏
  9. phpmyadmin设置自动登录和取消自动登录
  10. DoTween插件使用
  11. 算法笔记_面试题_9.解码方法/数字字符串解码成字母的种类
  12. 【游戏】基于matlab GUI时钟设计【含Matlab源码 1102期】
  13. chrome.storage和window.localStorage的区别
  14. HEVC代码学习0:HM使用+码流分析教程
  15. 视频教程-ArcGIS开发arcpy教程-其他
  16. 阿里巴巴的图标库 -------------本地使用
  17. 大厂面试快问快答,10分钟搞定MySQL夺命20问,你都能接住吗?
  18. w8系统桌面没有计算机图标,不见了win8系统桌面图标怎么办
  19. 手把手教你写《雷神》游戏(三)
  20. 思维模型 黄金圈法则

热门文章

  1. ICC Profile
  2. mysql数据库基操所遇问题及相关知识及命令记录
  3. 「双软认定」软件企业需要满足什么条件?
  4. 云服务器ecs是vps还是虚拟主机,云服务器ecs是vps还是虚拟主机
  5. 数学之美:数学究竟是如何被运用到生活中的?
  6. 无锡室内设计——流行的几种室内装饰风格
  7. 软件团队的模式-窝蜂模式
  8. 【解决】iptables -P INPUT DROP后无法联网
  9. 赏金猎人系列-如何测试sso相关的漏洞
  10. 点击菜单更改菜单栏背景图片