【python】王者荣耀全英雄高清壁纸爬虫共467M(多线程)
文章目录
- 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
win32
、mac
和linux
用户请自行通过源码打包。
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张壁纸。
每张壁纸又有8个url
,从sProdImgNo_1
到sProdImgNo_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. 具体打包流程
- 打开
cmd
控制台 cd
到项目路径- 创建虚拟环境:
pipenv install
- 打开虚拟环境:
pipenv shell
- 安装依赖模块:
pip install requests
- 安装打包工具:
pip install pyinstaller
- 执行打包命令:
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(多线程)相关推荐
- Python批量爬取王者荣耀英雄高清壁纸
Python批量爬取王者荣耀英雄高清壁纸 文章目录 Python批量爬取王者荣耀英雄高清壁纸 前言 爬虫步骤 python代码实现 总结 前言 很多喜欢玩王者的朋友很希望把王者荣耀的英雄图片拿来做壁纸 ...
- python爬取王者荣耀皮肤高清图
python爬取王者荣耀皮肤高清图 前期准备,导入模块 requests json os 进入王者荣耀官网,进入游戏壁纸页面,f12进入开发者模式,按照下图找到这个json文件,用于对图片的数据请求. ...
- python爬取4k高清壁纸(多线程版)
刚学了多线程,于是把上次写的博客拿出来进行改写, 原文链接:python爬取4k高清壁纸(再也不怕没有壁纸了) 爬取过程已经在上一次写过了,可以点击原文链接查看. 废话不多说,直接上多线程代码: im ...
- Nginx + uWSGI + Python + Django构建必应高清壁纸站
写在前面 做这个网站的初衷是因为,每次打开必应搜索搜东西的时候都会被上面的背景图片吸引,我想必应的壁纸应该是经过专业人员精选出来的,我甚至会翻看以前的历史图片,唯一美中不足的是必应的首页只能查看最多7 ...
- python爬取4k高清壁纸(再也不怕没有壁纸了)
今天突然想换壁纸,在网上找了一圈没有找到满意的,正好学了爬虫,于是我就想把它们全都爬取下来,慢慢挑选. 这次爬取的目标是:彼岸图网动漫壁纸 接下来,我将详细讲解爬取过程: 首先点开网站,右键–检查 观 ...
- Python爬无止境,获得王者荣耀全部高清皮肤
作为一名热爱王者两年的程序员,早就想爬取所有英雄皮肤的高清照片,在设个幻灯片放映,真香,这次只用16行代码就能实现,对于新手拿这个作为实战练手项目既简单又容易上手,快来尝试下. 百度"王者荣 ...
- python玩王者荣耀皮肤_python 王者荣耀皮肤高清图片下载 附源码
本帖最后由 你isbest 于 2018-3-20 16:33 编辑 最近在学python ,用python做了一个王者荣耀的皮肤高清图片的下载工具,发给大家这个是从官网下载一个json文件,所以是实 ...
- 编写python代码获取4k高清壁纸
Huskiesir最近在研究python爬虫大约俩周了吧,由于比较懒,也没把具体研究的过程与经验写下来,实在是一大憾事.这次直接上干货,代码送给大家: import re import request ...
- Python采集彼岸4K高清壁纸
前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 环境使用: Python 3.8 解释器 Pycharm 编辑器 模块 import re import requests & ...
最新文章
- Internet设置-连接选项卡-局域网(LAN)设置 某些设置由系统管理员进行管理
- [转]Linux系统下yum和apt-get的区别
- 后端接口的幂等性(转)
- linux 查看磁盘空间 拷贝不同目录下的文件
- SAP Spartacus 中 Angular json pipe 的工作原理
- 16攻击行为的学习理论
- win7卸载python2.7_win7重装系统后设置Python2.7环境
- 一个开源小项目,如何使用「分类网络」实现排球追踪
- WCF Service 配置文件注释(转)
- linux device_create_file属性 怎么调用,device_create_file创建多级目录
- CDS ORF 5‘UTR 3'UTR
- 【操作系统】进程通信-思维导图
- 在ASP.NET MVC中使用“RadioButtonList”和“CheckBoxList”
- android 获取service 实例化,在Activity中,如何获取service对象?a.可以通过直接实例化得到。b.可以通过绑定得到。c.通过star - 众答网问答...
- 当了一次微软产品的讲师
- Openssl漏洞修复
- Educational Codeforces Round 132 (Rated for Div. 2) 题解(A~D)
- O32 对接 交易所报盘软件_沈阳企业“新”社保报盘软件(下载地址)!
- Linux平台上文件同步——rsync+inotify之实时同步
- C++之operator关键字作用(一百一三十)