Python爬取王者荣耀英雄的皮肤数据并下载皮肤图片项目
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爬取王者荣耀英雄的皮肤数据并下载皮肤图片项目相关推荐
- 教你用python爬取王者荣耀英雄皮肤图片,并将图片保存在各自英雄的文件夹中。(附源码)
教你用python爬取王者荣耀英雄皮肤图片,并将图片保存在各自英雄的文件夹中.(附源码) 代码展示: 保存在各自的文件夹中 美么? 让我们开始爬虫之路 开发环境 windows 10 python3. ...
- Python爬取 | 王者荣耀英雄皮肤海报
这里只展示代码,具体介绍请点击下方链接. Python爬取 | 王者荣耀英雄皮肤海报 import requests import re import os import time import wi ...
- python玩王者荣耀皮肤碎片怎么获得_大神教你用Python爬取王者荣耀英雄皮肤,不充钱也能入手!...
前言 临下班前,看到群里有人在讨论用王者农药的一些皮肤作为电脑的壁纸,什么高清的,什么像素稍低的,网上查了一手,也有,但像素都不一样,所以,我就想着,自己去官网直接爬他的高清皮肤就好了,然后就有了这边 ...
- 利用Python爬取王者荣耀英雄皮肤!
image 0.引言 作为一款现象级游戏,王者荣耀,想必大家都玩过或听过,游戏里中各式各样的英雄,每款皮肤都非常精美,用做电脑壁纸再合适不过了.本篇就来教大家如何使用Python来爬取这些精美的英雄皮 ...
- python爬取王者皮肤别人可以看见效果吗_利用python爬取王者荣耀英雄皮肤图片
前两天看到同学用python爬下来LOL的皮肤图片,感觉挺有趣的,我也想试试,于是决定来爬一爬王者荣耀的英雄和皮肤图片. 然后,简单的分析一下结构,看看是否有反爬机制. 之后,在上网查阅资料后,发现所 ...
- python爬取王者荣耀英雄的背景故事
文章目录 前言 目标数据源分析 代码实现过程 1.代码框架 2.获取英雄编号及名称数据 3.获取英雄故事数据 完整代码 我只用了四个函数,<王者荣耀>就把每个英雄的背景故事递给了我 前言 ...
- Python爬取王者荣耀英雄图片及装备
在玩王者荣耀的时候一直想把装备合英雄的图片保存下来,但是官网的单个图片保存太慢一气之下写了个爬虫. 1.爬取装备 import requests from bs4 import BeautifulSo ...
- python爬取王者荣耀英雄素材图案例
import time import requests import threading from queue import Queue from urllib import parse import ...
- Python爬取王者荣耀全英雄台词语音及对应的文本
文章目录 写在前面 环境 网页分析 爬虫代码实现及说明 写在前面 很久之前就萌生了想爬取王者荣耀英雄台词语音,因为语音资源不是很好找,从官网获得的话,也比较麻烦.最近刚好有朋友需要语音素材,于是我就顺 ...
最新文章
- AgileEAS.NET平台开发实例-药店系统-准备开发环境(上)
- MyBatis之使用JSONObject代替JavaBean优雅返回多表查询结果
- sqoop1.4.5 导入 hive IOException running import job: java.io.IOException: Hive exited with status 1
- java线程在什么时候结束,java – 什么时候线程超出范围?
- 机器人抓取方式,值得研究。
- 复制含有随机指针节点的链表~哈希表的使用~(⌒▽⌒)
- maftools|TCGA肿瘤突变数据的汇总,分析和可视化
- Windows 使用浮动键盘语言栏
- phpmyadmin设置自动登录和取消自动登录
- DoTween插件使用
- 算法笔记_面试题_9.解码方法/数字字符串解码成字母的种类
- 【游戏】基于matlab GUI时钟设计【含Matlab源码 1102期】
- chrome.storage和window.localStorage的区别
- HEVC代码学习0:HM使用+码流分析教程
- 视频教程-ArcGIS开发arcpy教程-其他
- 阿里巴巴的图标库 -------------本地使用
- 大厂面试快问快答,10分钟搞定MySQL夺命20问,你都能接住吗?
- w8系统桌面没有计算机图标,不见了win8系统桌面图标怎么办
- 手把手教你写《雷神》游戏(三)
- 思维模型 黄金圈法则