吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4244|回复: 25
收起左侧

[Python 转载] python爬虫下载王者荣耀全皮肤高清大图

[复制链接]
yurika34 发表于 2021-8-17 00:53
本帖最后由 yurika34 于 2021-8-17 12:10 编辑

1.说是高清略有过分,不过1920×882的像素还是可以用作笔记本电脑的桌面的
2.借鉴了一些网上的资料,网址如下:
(1条消息) 爬虫小程序 - 爬取王者荣耀全皮肤_君莫笑-CSDN博客_爬虫程序
这里告诉我王者官网上有一个现在已经不显示了的json文件,但它还是时刻保持更新,可以通过网址访问到。
(1条消息) 利用python爬虫爬王者荣耀全英雄全皮肤(思路+代码)_歪歪的博客-CSDN博客
这个博客告诉我皮肤图片的网址,需要更改的参数很少,只有英雄编号和皮肤编号
(1条消息) python文件打包技术免费教程_君莫笑-CSDN博客
这是python文件打包的教程,挺简单的
3.其实爬取的技术含量并不高,但是直接爬详情页会少13个英雄的数据,用selenium又考虑到每个人的谷歌浏览器版本不同,chromedriver不能混用。所以需要结合上面那个古老的json文件
4.因为这个文件是我发给朋友的生日礼物,所以原来的代码里有祝福语,可执行文件不能直接发出来
5.需要纯净的可执行文件的话可以在下面回复我

PS:小白第一次发帖,上次被吞了,这次希望审核大大别吞帖

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
catherineh + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| yurika34 发表于 2021-8-17 01:02
本帖最后由 yurika34 于 2021-8-17 12:47 编辑

阿里云盘链接:
https://www.aliyundrive.com/s/iMzNsLr3Pkg

先上总体的源码
[Python] 纯文本查看 复制代码
# 1.导入所需模块
import requests
from bs4 import BeautifulSoup
import re
import os

# print(len(json_list)) # 英雄总数量:95个英雄
# print(json_list) # 打印结果,了解json_list的构造


#整体思路:从json文件获得每个英雄的详情页、名称、序号,然后去每个英雄的详情页获取皮肤的数量、各皮肤名称和对应链接
#最后注意命名,用os新建对应英雄名称的文件夹下载图片
url_main = 'https://pvp.qq.com/web201605/herolist.shtml'
headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.55'}  # 添加用户代{过}{滤}理
def getHtml(url):
    global headers
    r = requests.get(url, headers=headers,timeout=10)
    r.raise_for_status()
    r.encoding=r.apparent_encoding#防止乱码
    return r.text
# 由网址获取返回的text

def getLink():
    # global headers
    print("正在查找所有英雄链接......")
    # soup=BeautifulSoup(html,'html.parser')
    # heroList=soup.find_all('a',href=re.compile(r'herodetail/\d{3}.shtml'))#正则查找英雄链接,是个列表
    url = 'http://pvp.qq.com/web201605/js/herolist.json' #奇怪的json文件
    r = requests.get(url, headers=headers,timeout=10)
    r.encoding = r.apparent_encoding  # 防止乱码
    heroList = r.json()
    print("获取英雄链接成功!")
    for each in heroList:
        id = each['ename']  # 获得英雄序号
        link='herodetail/'+str(id)+'.shtml'#获取英雄所在链接
        name=each['cname']#获取英雄名字
        savePic(link, name, id)
    print("所有英雄的皮肤下载完成!")
#由

def savePic(link,name,id):#上面代码中返回的链接,名字和英雄序号
    url='https://pvp.qq.com/web201605/'+link
    html=getHtml(url)
    soup = BeautifulSoup(html, 'html.parser')
    skinlist=soup.find('ul',class_='pic-pf-list')['data-imgname']#寻找皮肤字符串
    skin_count=skinlist.count('&')#找到皮肤数量
    skinlist=skinlist.replace('&','')#去&
    for i in range(10):#去数字
        skinlist=skinlist.replace(str(i),'')
    skin_name=skinlist.split('|')#得到皮肤名字列表
    localPath = 'pic/' + name + '/'  # 创建每个英雄的文件夹
    if not os.path.exists(localPath):  # 新建文件夹,判断是否存在
        os.mkdir(localPath)
    url_base = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/'  # 图片网址固定前缀
    global headers
    for i in range(1, skin_count + 1):
        # 网址拼接, 构造完整的图片网址
        url_pic = url_base + str(id) + '/' + str(id) + '-bigskin-' + str(i) + '.jpg'
        try:
            # 获取图片信息
            print("正在下载"+name+"的"+skin_name[i - 1]+"皮肤图片")
            picture = requests.get(url_pic,headers=headers).content
            # print(picture) # 打印图片网址
            # 下载图片 文件路径为: pic/英雄名/英雄名-皮肤名.jpg (需要新建pic文件夹)
            with open('pic/' + name + '/' + skin_name[i - 1] + '.jpg', 'wb') as f:
                f.write(picture)
            print("--->成功!")
        except requests.exceptions.ConnectionError:
            print('数据异常或错误!当前图片无法下载')
    print("所有"+name+"的英雄皮肤下载完成!")

def main():
    # main = getHtml(url_main)
    getLink()
main()

免费评分

参与人数 1吾爱币 +7 热心值 +1 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

 楼主| yurika34 发表于 2021-8-17 01:34
本帖最后由 yurika34 于 2021-8-17 01:36 编辑

[Python] 纯文本查看 复制代码
def savePic(link,name,id):#上面代码中返回的链接,名字和英雄序号
    url='https://pvp.qq.com/web201605/'+link
    html=getHtml(url)
    soup = BeautifulSoup(html, 'html.parser')
    skinlist=soup.find('ul',class_='pic-pf-list')['data-imgname']#寻找皮肤字符串
    skin_count=skinlist.count('&')#找到皮肤数量
    skinlist=skinlist.replace('&','')#去&
    for i in range(10):#去数字
        skinlist=skinlist.replace(str(i),'')
    skin_name=skinlist.split('|')#得到皮肤名字列表
    localPath = 'pic/' + name + '/'  # 创建每个英雄的文件夹
    if not os.path.exists(localPath):  # 新建文件夹,判断是否存在
        os.mkdir(localPath)
    url_base = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/'  # 图片网址固定前缀
    global headers
    for i in range(1, skin_count + 1):
        # 网址拼接, 构造完整的图片网址
        url_pic = url_base + str(id) + '/' + str(id) + '-bigskin-' + str(i) + '.jpg'
        try:
            # 获取图片信息
            print("正在下载"+name+"的"+skin_name[i - 1]+"皮肤图片")
            picture = requests.get(url_pic,headers=headers).content
            # print(picture) # 打印图片网址
            # 下载图片 文件路径为: pic/英雄名/英雄名-皮肤名.jpg (需要新建pic文件夹)
            with open('pic/' + name + '/' + skin_name[i - 1] + '.jpg', 'wb') as f:
                f.write(picture)
            print("--->成功!")
        except requests.exceptions.ConnectionError:
            print('数据异常或错误!当前图片无法下载')
    print("所有"+name+"的英雄皮肤下载完成!")

这段代码是整篇的重点,其实如果不想按英雄分类,并且每个皮肤都命名,爬取所有英雄,而且将来也能爬取的情况下,5行就解决
这个函数接收的参数是英雄链接,英雄编号,英雄名称
看起来是三个参数,其实只有两个。
重点在于,王者不同的英雄介绍网站只差一个编号,同一英雄不同皮肤的网站只差一个数字
而这个数字就是英雄编号

明天再码字,要成品的留言,卑微要求。。。3个人我就发exe文件
 楼主| yurika34 发表于 2021-8-17 00:55
本帖最后由 yurika34 于 2021-8-17 01:38 编辑

https://blog.csdn.net/WeiLanooo/article/details/100547708
https://blog.csdn.net/qq_43461749/article/details/103312044
这是上面的网站,不知道是不是浏览器的原因已复制就变成这副德行
 楼主| yurika34 发表于 2021-8-17 01:07
[Python] 纯文本查看 复制代码
# 1.导入所需模块
import requests
from bs4 import BeautifulSoup
import re
import os
[Python] 纯文本查看 复制代码
url_main = 'https://pvp.qq.com/web201605/herolist.shtml'
headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.55'}  # 添加用户代{过}{滤}理

经典requests库提取,bs解析的组合
re用来开正则表达式
os是最没用的,用于创建文件夹,如果不想分类甚至可以不加
添加请求头告诉天美我们是大大的良民
 楼主| yurika34 发表于 2021-8-17 01:13
本帖最后由 yurika34 于 2021-8-17 01:15 编辑

[Python] 纯文本查看 复制代码
def getHtml(url):
    global headers
    r = requests.get(url, headers=headers,timeout=10)
    r.raise_for_status()
    r.encoding=r.apparent_encoding#防止乱码
    return r.text
# 由网址获取返回的text


这一段看似平平无奇,实则暗藏C语言拿优的学生的基本功
先global 把headers拉进函数,
然后经典requests请求,设计timeout防止被封了IP还傻等着
调用一下状态码,因为觉得没有问题就没有把状态码打印出来
防乱码的那一行很有必要,因为这个网页是gbk编码,用utf-8不会报错,但会出现各种奇怪的符号让你怀疑天美是不是又用了什么加密手段


 楼主| yurika34 发表于 2021-8-17 01:25
[Python] 纯文本查看 复制代码
def getLink():
    # global headers
    print("正在查找所有英雄链接......")
    # soup=BeautifulSoup(html,'html.parser')
    # heroList=soup.find_all('a',href=re.compile(r'herodetail/\d{3}.shtml'))#正则查找英雄链接,是个列表
    url = 'http://pvp.qq.com/web201605/js/herolist.json' #奇怪的json文件
    r = requests.get(url, headers=headers,timeout=10)
    r.encoding = r.apparent_encoding  # 防止乱码
    heroList = r.json()
    print("获取英雄链接成功!")
    for each in heroList:
        id = each['ename']  # 获得英雄序号
        link='herodetail/'+str(id)+'.shtml'#获取英雄所在链接
        name=each['cname']#获取英雄名字
        savePic(link, name, id)
    print("所有英雄的皮肤下载完成!")

这串代码很长但没甚么要讲的,打了注释的是借鉴的帖子里的代码,不够完善,可以直接不看
大家可以把里面json文件的网址复制到浏览器里下载,我的附件里也有,用记事本打开就可以看到json文件的结构
json文件里有英雄的名称、编号、皮肤
之前的想法是爬json文件里的皮肤
但是呢,仔细一看,镜的炽阳神光,赵云的龙胆。一些英雄的原皮它都没有。
不想尽善尽美,爬这里的就行了,30行代码解决问题

herolist.txt

18.08 KB, 下载次数: 13, 下载积分: 吾爱币 -1 CB

把后缀改了

Strive8 发表于 2021-8-17 08:19
楼主加油,支持一波
龍謹 发表于 2021-8-17 08:20
谢谢分享,学不学得到,先学!
dork 发表于 2021-8-17 08:52
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-29 05:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表