文章目录

  • 1. 成果展示
  • 2. 单张预览
  • 3. 软件下载
  • 4. 壁纸下载
  • 5. 进度打印
  • 6. 目标网址
  • 7. 依赖模块
  • 8. 完整代码
  • 9. 代码剖析
  • 10. 打包教程
    • 10.1. 打包前的准备
    • 10.2. 具体打包流程
    • 10.3. 需要注意的点
  • 11. 相关推荐

1. 成果展示

2. 单张预览

3. 软件下载

win64:https://ghgxj.lanzous.com/iCfeUj9vhij

win32maclinux用户请自行通过源码打包。

4. 壁纸下载

共467M:https://ghgxj.lanzous.com/b08xsj0va

5. 进度打印

壁纸分辨率及序号如下:
1 > 缩略图
2 > 1024x768
3 > 1280x720
4 > 1280x1024
5 > 1440x900
6 > 1920x1080 (推荐)
7 > 1920x1200
8 > 1920x1440
请选择分辨率 (默认是6):
457/457 |████████████████████| 任务进度: 100% 已用时间: 89S 剩余时间: 0S
请按任意键继续. . .

6. 目标网址

https://pvp.qq.com/web201605/wallpaper.shtml

7. 依赖模块

pip install requests

8. 完整代码

# run.py
import re, os, time, json, requests
from urllib.parse import unquote
import concurrent.futures as cfclass WangzheDownloader(object):# 初始化def __init__(self):self.root = './heros/'if not os.path.exists(self.root):os.mkdir(self.root)self.numberSize = 6self.url = 'https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page={}&iOrder=0&SearchKey=sProdName&iSortNumClose=1&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=1607443031450'res = requests.get(self.url.format(0)).json()self.totalPage = int(res.get('iTotalPages'))self.sum = int(res.get('iTotalLines'))self.count = 0self.startTime = time.time()# 选择壁纸分辨率def size(self):print('壁纸分辨率及序号如下: ')size_list = ['1 > 缩略图','2 > 1024x768','3 > 1280x720','4 > 1280x1024','5 > 1440x900','6 > 1920x1080 (推荐)','7 > 1920x1200','8 > 1920x1440']for size in size_list:print(size)numberSize = input('请选择分辨率 (默认是6): ')self.numberSize = numberSize if numberSize else 6# 获取103位英雄的名字def name(self):url = 'https://pvp.qq.com/web201605/js/herolist.json'res = requests.get(url).json()self.hero = [item['cname'] for item in res]# 单张图片下载def down(self, img_name, img_url):res = requests.get(img_url)with open(img_name, 'wb') as f:f.write(res.content)self.count += 1endTime = time.time()self.show(self.count, self.sum, endTime-self.startTime)# 爬取每一页def page(self, numberPage):res = requests.get(self.url.format(numberPage)).json()for item in res.get('List'):# 去除图片名中的特殊字符img_name = re.sub('[/\\:*?"<>|]', '', unquote(item['sProdName']))# 根据英雄名建立分类文件夹temp = re.split('[·-]', img_name)control = Truefor each in temp:if each in self.hero:control = Falseimg_dir = self.root+eachif not os.path.exists(img_dir):os.mkdir(img_dir)img_name = img_dir+'/'+img_name+'.jpg'breakif control:img_dir = self.root+'其它'if not os.path.exists(img_dir):os.mkdir(img_dir)img_name = img_dir+'/'+img_name+'.jpg'img_url = unquote(item[f'sProdImgNo_{self.numberSize}'])img_url = img_url.replace('/200', '/0') # /0才是原图,/200都是缩略图self.down(img_name, img_url)# 打印进度条def show(self, num, _sum,  runTime):barLen = 20  # 进度条的长度perFin = num/_sumnumFin = round(barLen*perFin)numNon = barLen-numFinleftTime = (1-perFin)*(runTime/perFin)print(f"{num:0>{len(str(_sum))}}/{_sum}",f"|{'█'*numFin}{' '*numNon}|",f"任务进度: {perFin*100:.0f}%",f"已用时间: {runTime:.0f}S",f"剩余时间: {leftTime:.0f}S",end='\r')if num == _sum:print()# 多线程def main(self):self.size()self.name()with cf.ThreadPoolExecutor() as tp:for page in range(self.totalPage):tp.submit(self.page, page)if __name__ == "__main__":WangzheDownloader().main()

9. 代码剖析

打开目标网址,通过F12检查发现,有现有的API接口可供调用:

API接口里面存的就是壁纸的下载直链,也提供了图片总张数和总页数的信息:

既然有接口,我们就直接请求接口了,请求url如下:

https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page=0&iOrder=0&SearchKey=sProdName&iSortNumClose=1&jsoncallback=jQuery17107126052728750412_1607442410515&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=1607443031450

jsoncallback=jQuery17107126052728750412_1607442410515这个参数不要,不然返回的是带前缀和后缀的jsonp数据,会影响解析。

API接口返回的json数据中,List存的是图片列表,列表长度就是请求参数中的iListNum的值,默认是20,也就是每页返回20张壁纸。

每张壁纸又有8url,从sProdImgNo_1sProdImgNo_8,对应于8种分辨率:

分辨率的对应关系如下:

size_list = ['1 > 缩略图','2 > 1024x768','3 > 1280x720','4 > 1280x1024','5 > 1440x900','6 > 1920x1080 (推荐)','7 > 1920x1200','8 > 1920x1440'
]

你可能会问:不是还有一个sThumbURL吗?其实这个就是sProdImgNo_1,不信你可以试试。

sProdName是图片名字,无论是图片名还是链接,都需要进行url解码,在python中通过unquote解码:

from urllib.parse import unquote

解码后,把图片链接在浏览器中打开,你会发现:怎么都是缩略图?这个将图片链接后面的/200改为/0就行了。

img_url = img_url.replace('/200', '/0') # /0才是原图,/200都是缩略图

最后要说的就是图片分类问题了,每个英雄都有很多皮肤,所以我们根据英雄名建立文件夹,将同一英雄的不同皮肤都放到同一文件夹。

王者荣耀英雄名也是找了一个API接口获取的,获取方式如下:

def name(self):url = 'https://pvp.qq.com/web201605/js/herolist.json'res = requests.get(url).json()self.hero = [item['cname'] for item in res]

至于这个获取英雄名的接口,也是通过F12检查英雄资料找到的:

接口响应信息如下,直接在浏览器中预览会乱码:

json文件下载下来查看,是正常的,其中cname就是英雄名:

10. 打包教程

10.1. 打包前的准备

先安装pipenv,在pipenv创建的虚拟环境下打包,这样打包的软件会很小。

pip install pipenv

10.2. 具体打包流程

  1. 打开cmd控制台
  2. cd到项目路径
  3. 创建虚拟环境:pipenv install
  4. 打开虚拟环境:pipenv shell
  5. 安装依赖模块:pip install requests
  6. 安装打包工具:pip install pyinstaller
  7. 执行打包命令:pyinstaller -F -i favicon.ico run.py

10.3. 需要注意的点

run.py就是上方的完整代码favicon.ico是软件图标,我用的是下面这个:

下载下来是png格式,你必须转为ico格式,这里推荐一个在线转换的工具:

png2ico:https://www.easyicon.net/covert/

11. 相关推荐

【python】王者荣耀全英雄头像爬虫(多线程)

【python】王者荣耀全英雄高清壁纸爬虫共467M(多线程)相关推荐

  1. Python批量爬取王者荣耀英雄高清壁纸

    Python批量爬取王者荣耀英雄高清壁纸 文章目录 Python批量爬取王者荣耀英雄高清壁纸 前言 爬虫步骤 python代码实现 总结 前言 很多喜欢玩王者的朋友很希望把王者荣耀的英雄图片拿来做壁纸 ...

  2. python爬取王者荣耀皮肤高清图

    python爬取王者荣耀皮肤高清图 前期准备,导入模块 requests json os 进入王者荣耀官网,进入游戏壁纸页面,f12进入开发者模式,按照下图找到这个json文件,用于对图片的数据请求. ...

  3. python爬取4k高清壁纸(多线程版)

    刚学了多线程,于是把上次写的博客拿出来进行改写, 原文链接:python爬取4k高清壁纸(再也不怕没有壁纸了) 爬取过程已经在上一次写过了,可以点击原文链接查看. 废话不多说,直接上多线程代码: im ...

  4. Nginx + uWSGI + Python + Django构建必应高清壁纸站

    写在前面 做这个网站的初衷是因为,每次打开必应搜索搜东西的时候都会被上面的背景图片吸引,我想必应的壁纸应该是经过专业人员精选出来的,我甚至会翻看以前的历史图片,唯一美中不足的是必应的首页只能查看最多7 ...

  5. python爬取4k高清壁纸(再也不怕没有壁纸了)

    今天突然想换壁纸,在网上找了一圈没有找到满意的,正好学了爬虫,于是我就想把它们全都爬取下来,慢慢挑选. 这次爬取的目标是:彼岸图网动漫壁纸 接下来,我将详细讲解爬取过程: 首先点开网站,右键–检查 观 ...

  6. Python爬无止境,获得王者荣耀全部高清皮肤

    作为一名热爱王者两年的程序员,早就想爬取所有英雄皮肤的高清照片,在设个幻灯片放映,真香,这次只用16行代码就能实现,对于新手拿这个作为实战练手项目既简单又容易上手,快来尝试下. 百度"王者荣 ...

  7. python玩王者荣耀皮肤_python 王者荣耀皮肤高清图片下载 附源码

    本帖最后由 你isbest 于 2018-3-20 16:33 编辑 最近在学python ,用python做了一个王者荣耀的皮肤高清图片的下载工具,发给大家这个是从官网下载一个json文件,所以是实 ...

  8. 编写python代码获取4k高清壁纸

    Huskiesir最近在研究python爬虫大约俩周了吧,由于比较懒,也没把具体研究的过程与经验写下来,实在是一大憾事.这次直接上干货,代码送给大家: import re import request ...

  9. Python采集彼岸4K高清壁纸

    前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 环境使用: Python 3.8 解释器 Pycharm 编辑器 模块 import re import requests & ...

最新文章

  1. Internet设置-连接选项卡-局域网(LAN)设置 某些设置由系统管理员进行管理
  2. [转]Linux系统下yum和apt-get的区别
  3. 后端接口的幂等性(转)
  4. linux 查看磁盘空间 拷贝不同目录下的文件
  5. SAP Spartacus 中 Angular json pipe 的工作原理
  6. 16攻击行为的学习理论
  7. win7卸载python2.7_win7重装系统后设置Python2.7环境
  8. 一个开源小项目,如何使用「分类网络」实现排球追踪
  9. WCF Service 配置文件注释(转)
  10. linux device_create_file属性 怎么调用,device_create_file创建多级目录
  11. CDS ORF 5‘UTR 3'UTR
  12. 【操作系统】进程通信-思维导图
  13. 在ASP.NET MVC中使用“RadioButtonList”和“CheckBoxList”
  14. android 获取service 实例化,在Activity中,如何获取service对象?a.可以通过直接实例化得到。b.可以通过绑定得到。c.通过star - 众答网问答...
  15. 当了一次微软产品的讲师
  16. Openssl漏洞修复
  17. Educational Codeforces Round 132 (Rated for Div. 2) 题解(A~D)
  18. O32 对接 交易所报盘软件_沈阳企业“新”社保报盘软件(下载地址)!
  19. Linux平台上文件同步——rsync+inotify之实时同步
  20. C++之operator关键字作用(一百一三十)

热门文章

  1. # 后端开发技巧、常用规范
  2. 【转载】双微信分享发生TransactionTooLargeException 异常记录
  3. stm32开发之使用Keil MDK以及标准外设库创建STM32工程
  4. [js操作(转)]在IE下js操作本地文件相关方法
  5. Arduino--YF-S201水流量检测传感器
  6. JS 在线引入jQuery
  7. 虚幻4基础操作 - 初中生学UE4第一季-丁树凯-专题视频课程
  8. 网络工程师就业前景、职业规划和工资待遇
  9. vscode ubuntu 环境下ssh 远程连接 不稳定 重新打开
  10. 项目设计Andriod部分-做一个学习类App-1