本文已参与「新人创作礼」活动,一起开启掘金创作之路。
自从发现了该海报,我沦陷了😍😍,白鹤梁神女YYDS
直接给pycharm换上
❤直呼完美❤
实现过程
一、爬取王者荣耀图片
1.之前代码展示
import os
import requests
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())) # 提取英雄的编号
yx_urls = 'https://pvp.qq.com/web201605/herodetail/{}.shtml'
# 下载图片
def downloadPic():
i = 0
for j in hero_number:
yx_url = 'https://pvp.qq.com/web201605/herodetail/{}.shtml'.format(str(j))
r = requests.get(yx_url)
# 创建文件夹
try:
os.mkdir(r'E:\Python社区版\1\\' + hero_name[i])
except:
pass
# 进入创建好的文件夹
os.chdir(r'E:\Python社区版\1\\' + 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
# 到后面没有皮肤时,随着k的增大,onehero_link所构成的网址为无效
# 例如http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/195/195-bigskin-8.jpg为无效网址
if im.status_code == 200:
f = open(str(k) + '.jpg', 'wb')
f.write(im.content) # 写入文件
f.close()
w = len(hero_name)-j+1
print(i)
print(hero_name[w] + '的皮肤下载成功!!')
downloadPic()
以上代码能爬取王者荣耀的高清图片
缺点:图片的命名为数字而不是皮肤名字
因此需要将代码进行修改,实现图片名字与英雄名字一一对应
2.修改后代码讲解
url = 'https://pvp.qq.com/web201605/js/herolist.json'
herolist = requests.get(url) # 获取英雄列表json文件
print(herolist.text)
首先,我们可以发现王者荣耀英雄数据是存在herolist.json中,所以我们需要通过requests获取相关数据
print(herolist.text)
部分结果如下图
接下来我们需要将获取的数据转换为json格式,方便提取其中的数据。
herolist_json = herolist.json() # 转化为json格式
# print(herolist_json)
hero_name = list(map(lambda x: x['cname'], herolist.json())) # 提取英雄的名字
# print(hero_name)
hero_number = list(map(lambda x: x['ename'], herolist.json())) # 提取英雄的编号
hero_name = list(map(lambda x: x['cname'], herolist.json())) # 提取英雄的名字
hero_number = list(map(lambda x: x['ename'], herolist.json())) # 提取英雄的编号
这两行代码表示提取json文件中英雄的名字和编号,并以列表方式存储,方便接下来的遍历。
# skin_names = re.compile('"skin_name": "(.*?)"', re.S)
# sss = skin_names.findall(herolist.text)
# print(sss)
# ['正义爆轰|地狱岩魂', '恋之微风|万圣前夜|天鹅之梦|纯白花嫁|缤纷独角兽', '苍天翔龙|忍●炎影|未来纪元|皇家上将|嘻哈天王|白执事|引擎之心', '和平守望|金属风暴|龙骑士|进击墨子号', '魅
这是笔者在写代码时候第一次想的方案,也是提取英雄的皮肤名称,结果如下,是个列表。
['正义爆轰|地狱岩魂', '恋之微风|万圣前夜|天鹅之梦|纯白花嫁|缤纷独角兽', '苍天翔龙|忍●炎影|未来纪元|皇家上将|嘻哈天王|白执事|引擎之心', '和平守望|金属风暴|龙骑士|进击墨子号', '魅
但是后来发现即使你获得了这个列表,将它与图片一一对应还是有些困难,因为它遍历该列表,并且还要进一步获取皮肤名称,并且还有|符号混在皮肤名称中间。
简单来说; 首先要从整个列表中遍历 正义爆轰|地狱岩魂,然后又要获取其中的正义爆轰和地狱岩魂,其中有 | 符号作为干扰项,即使成功获取,接下来还要和皮肤图片一一对应,也有点麻烦。
因此我找了其他方法
# 下载图片
def downloadPic():
i = 0
for j in hero_number:
yx_url = 'https://pvp.qq.com/web201605/herodetail/{}.shtml'.format(str(j))
r = requests.get(yx_url)
# 创建文件夹
try:
os.mkdir(r'E:\Python社区版\王者荣耀皮肤图片\\' + hero_name[i])
except:
pass
# 进入创建好的文件夹
os.chdir(r'E:\Python社区版\王者荣耀皮肤图片\\' + hero_name[i])
i += 1
# #经过一系列转化,将皮肤转成列表格式方便遍历
pifu = re.compile('<ul class="pic-pf-list pic-pf-list3" data-imgname="(.*?)">', re.S)
ssss = pifu.findall(r.content.decode("gbk"))[0]
aaaa = ssss.replace("|", "")
# print(aaaa)
bbbb = re.sub(r'&\d*', '", "', aaaa)
cccc = '["{}"]'.format(bbbb)
# 将字符串转化为列表
dddd = eval(cccc)
# 删除列表最后的""
del dddd[-1]
# print(dddd)
for k, l in enumerate(dddd):
# print(k+1, l)
# 拼接url
onehero_link = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/' + str(j) + '/' + str(j) + '-bigskin-' + str(k+1) + '.jpg'
im = requests.get(onehero_link) # 请求url
if im.status_code == 200:
f = open(str(l) + '.jpg', 'wb')
print('{}正在下载{}皮肤😁😁'.format(i, l))
f.write(im.content) # 写入文件
f.close()
接下来自定义一个函数,在自定义函数中,因为英雄皮肤存在个个英雄的网页中,所以要先构建英雄url,遍历之前获得的hero_number列表构建英雄url。
try:
os.mkdir(r'E:\Python社区版\王者荣耀皮肤图片\\' + hero_name[i])
except:
pass
根据英雄名字创建文件夹,结果如下
os.chdir(r'E:\Python社区版\王者荣耀皮肤图片\\' + hero_name[i])
上面代码表示进入创建好的文件夹
点击小乔英雄,然后查看网页源代码,发现其中的数据非常不规则,要做的就是提取数据,并进行数据清洗
#经过一系列转化,将皮肤转成列表格式方便遍历
pifu = re.compile('<ul class="pic-pf-list pic-pf-list3" data-imgname="(.*?)">', re.S)
ssss = pifu.findall(r.content.decode("gbk"))[0]
aaaa = ssss.replace("|", "")
# print(aaaa)
bbbb = re.sub(r'&\d*', '", "', aaaa)
cccc = '["{}"]'.format(bbbb)
# 将字符串转化为列表
dddd = eval(cccc)
# 删除列表最后的""
del dddd[-1]
# print(dddd)
以上代码实现的功能是构建皮肤名称列表,即从下图的ssss到dddd的转变,大家可以自己取试试
ssss: 正义爆轰&0|地狱岩魂&12|无尽征程&1
dddd: ['正义爆轰', '地狱岩魂', '无尽征程']ssss: 恋之微风&0|万圣前夜&0|天鹅之梦&26|纯白花嫁&11|缤纷独角兽&12|丁香结&1|青蛇&12|音你心动&15
dddd: ['恋之微风', '万圣前夜', '天鹅之梦', '纯白花嫁', '缤纷独角兽', '丁香结', '青蛇', '音你心动']
这一过程 和上面的③小插曲很像,只不过这个是在每一个英雄相关url里面构造了皮肤的名称,可以遍历,皮肤图片和名称也可以很好的对应(不是正向就是逆向)。
for k, l in enumerate(dddd):
# print(k+1, l)
# 拼接url
onehero_link = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/' + str(j) + '/' + str(j) + '-bigskin-' + str(k+1) + '.jpg'
im = requests.get(onehero_link) # 请求url
if im.status_code == 200:
f = open(str(l) + '.jpg', 'wb')
print('{}正在下载{}皮肤😁😁'.format(i, l))
f.write(im.content) # 写入文件
f.close()
for k, l in enumerate(dddd):
enumerate()函数一般用于for循环,可以在遍历中获得索引和元素值
接下来构建图片的url,然后将该图片保存到创建好并打开的文件夹中。
一定别忘了f.close() ,因为代码不是with open()as f:的格式
最后调用该自定义函数即可运行
3.源代码展示
import os
import requests
import re
url = 'https://pvp.qq.com/web201605/js/herolist.json'
herolist = requests.get(url) # 获取英雄列表json文件
# print(herolist.text)
herolist_json = herolist.json() # 转化为json格式
# print(herolist_json)
hero_name = list(map(lambda x: x['cname'], herolist.json())) # 提取英雄的名字
# print(hero_name)
hero_number = list(map(lambda x: x['ename'], herolist.json())) # 提取英雄的编号
# # 尝试过从json文件中提取数据,如下,虽然提取到了,但是如果要将它和皮肤名字一一对应,恐怕有点难
# # skin_names = re.compile('"skin_name": "(.*?)"', re.S)
# # sss = skin_names.findall(herolist.text)
# # print(sss)
# # ['正义爆轰|地狱岩魂', '恋之微风|万圣前夜|天鹅之梦|纯白花嫁|缤纷独角兽', '苍天翔龙|忍●炎影|未来纪元|皇家上将|嘻哈天王|白执事|引擎之心', '和平守望|金属风暴|龙骑士|进击墨子号', '魅
#
# yx_urls = 'https://pvp.qq.com/web201605/herodetail/{}.shtml'
# 下载图片
def downloadPic():
i = 0
for j in hero_number:
yx_url = 'https://pvp.qq.com/web201605/herodetail/{}.shtml'.format(str(j))
r = requests.get(yx_url)
# 创建文件夹
try:
os.mkdir(r'E:\Python社区版\王者荣耀皮肤图片\\' + hero_name[i])
except:
pass
# 进入创建好的文件夹
os.chdir(r'E:\Python社区版\王者荣耀皮肤图片\\' + hero_name[i])
i += 1
# #经过一系列转化,将皮肤转成列表格式方便遍历
pifu = re.compile('<ul class="pic-pf-list pic-pf-list3" data-imgname="(.*?)">', re.S)
ssss = pifu.findall(r.content.decode("gbk"))[0]
# print("ssss:", ssss)
aaaa = ssss.replace("|", "")
# print("aaaa:", aaaa)
bbbb = re.sub(r'&\d*', '", "', aaaa)
cccc = '["{}"]'.format(bbbb)
# 将字符串转化为列表
dddd = eval(cccc)
# 删除列表最后的""
del dddd[-1]
# print("dddd:", dddd)
for k, l in enumerate(dddd):
# print(k+1, l)
# 拼接url
onehero_link = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/' + str(j) + '/' + str(j) + '-bigskin-' + str(k+1) + '.jpg'
im = requests.get(onehero_link) # 请求url
if im.status_code == 200:
f = open(str(l) + '.jpg', 'wb')
print('{}正在下载{}皮肤😁😁'.format(i, l))
f.write(im.content) # 写入文件
f.close()
# #
# # w = len(hero_name)-j+1
# # print("{}的皮肤下载成功!!".format(hero_name[w]))
#
downloadPic()
4.结果展示
秘密就是赵云真是TiMi亲儿子,皮肤最多
二、将好看的皮肤设置为pycharm背景
首先file---settings,接下来操作如下图
其中的4可以设置背景不透明度,建议各位好好调调,在享受背景的时候不受背景影响(正所谓鱼和熊掌不可兼得,背景太亮会影响看代码的效率😁😁)
❤如果觉得笔者写的不错的,麻烦给个三连❤