栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

为了营造一个看代码舒服的氛围,写了爬取王者荣耀所有高清皮肤的代码,现在写代码舒心了(中途发现了一个秘密)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为了营造一个看代码舒服的氛围,写了爬取王者荣耀所有高清皮肤的代码,现在写代码舒心了(中途发现了一个秘密)

自从发现了该海报,我沦陷了,白鹤梁神女YYDS

直接给pycharm换上

❤直呼完美❤

实现过程

目录

一、爬取王者荣耀图片

1.之前代码展示

2.修改后代码讲解

 ①

 ②

③小插曲

3.源代码展示

4.结果展示

二、将好看的皮肤设置为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('
    ', 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('
    ', 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('
    ', 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可以设置背景不透明度,建议各位好好调调,在享受背景的时候不受背景影响(正所谓鱼和熊掌不可兼得,背景太亮会影响看代码的效率) 

❤如果觉得笔者写的不错的,麻烦给个三连❤

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/272709.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号