import os, time, requests, json, re, sys
from retrying import retry
from urllib import parse """
文章描述:爬取王者荣耀英雄壁纸+封面
使用说明:直接在最底下输入下载地址,然后运行
作者:Felix(2020/7/30 14:42)
最新修改时间:2021-4-5
公众号:【全面资源集】
博客:https://blog.csdn.net/weixin_49012647
说明:没有使用进程,面向对象加过程,使用控制台输出显示进度,没有反扒机制,不识别UA,此文章调试了两天才趋近完美
""" class HonorOfKings:
"""王者荣耀皮肤下载"""
def __init__(self, save_path='./heros'):
self.save_path = save_path # 默认路径为:./heros
self.time = str(time.time()).split('.')
self.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&iSortNumClose=1&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=%s' % \
self.time[0] # 这是抓包获得的,暂时不会。。 def hello(self):
"""这是排面"""
print("*" * 50)
print(' ' * 18 + '王者荣耀壁纸下载')
print(' ' * 5 + '公众号:【全面资源集】')
print("*" * 50)
return self def run(self):
"""爬虫主程序"""
print('↓' * 20 + ' 格式选择: ' + '↓' * 20)
print('1.缩略图 2.1024x768 3.1280x720 4.1280x1024 5.1440x900 6.1920x1080 7.1920x1200 8.1920x1440')
size = input('请输入您想下载的格式序号,默认6:')
print()
size = size if size and int(size) in [1, 2, 3, 4, 5, 6, 7, 8] else 6 # 直接回车就选6 hero_list = self.request('http://gamehelper.gm825.com/wzry/hero/list?channel_id=90009a&app_id=h9044j&game_id=7622&game_name=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80&vcode=12.0.3&version_code=1203&cuid=2654CC14D2D3894DBF5808264AE2DAD7&ovr=6.0.1&device=Xiaomi_MI+5&net_type=1&client_id=1Yfyt44QSqu7PcVdDduBYQ%3D%3D&info_ms=fBzJ%2BCu4ZDAtl4CyHuZ%2FJQ%3D%3D&info_ma=XshbgIgi0V1HxXTqixI%2BKbgXtNtOP0%2Fn1WZtMWRWj5o%3D&mno=0&info_la=9AChHTMC3uW%2BfY8%2BCFhcFw%3D%3D&info_ci=9AChHTMC3uW%2BfY8%2BCFhcFw%3D%3D&mcc=0&clientversion=&bssid=VY%2BeiuZRJ%2FwaXmoLLVUrMODX1ZTf%2F2dzsWn2AOEM0I4%3D&os_level=23&os_id=dc451556fc0eeadb&resolution=1080_1920&dpi=480&client_ip=192.168.0.198&pdunid=a83d20d8').json()
hero_names = [] # 上面网址是抓包获得的,暂时不会。。
cover_div = os.path.join(self.save_path, '英雄封面')
os.makedirs(cover_div)
num = 0 # 下载第几张封面,用于显示进度
all = len(hero_list['list'])
for i in hero_list['list']:
hero_names.append(i['name']) # 把英雄名放入列表
content = self.request(i['cover']).content
cover_path = os.path.join(cover_div, i['name']+'.png')
if not os.path.exists(cover_path):
with open(cover_path, 'wb') as f: # 保存封面
f.write(content)
num += 1
sys.stdout.write('\r')
sys.stdout.write('→ → → →正在爬取封面....爬取进度:%s|%s张' % (num, all))
# print(hero_names) page = 0 # 第零页,用于获取英雄总数,并保存第零页图片
offset = 20 # 页数,用于递增爬取不同页
total_response = self.request(self.url.format(page)).text
total_res = json.loads(total_response)
total_page = --int(total_res['iTotalPages']) # 总页数(25)
print('→ → → →开始爬取皮肤...(总共 {} 页)'.format(total_page))
while True:
if offset > total_page:
break
url = self.url.format(offset)
result = self.request(url).json() # 获取json格式数据(不标准),但是能索引,你也可以用下面的
# response = self.request(url).text
# result = json.loads(response)
now = 0 # 表示第几张图,用于显示进度
for item in result["List"]:
now += 1
split_name = parse.unquote(item['sProdName']).split('-')
hero_name = split_name[0] # 英雄名,但是不规范
hero_name = re.sub(r'[【】:.<>|·@#$%^&() ]', '', hero_name) # 把垃圾符号弄掉
for f in hero_names: # 有些英雄名是:张良·幽兰居士,但是我希望所有同英雄皮肤放在一个目录下,所有加上这一步
if f in hero_name:
hero_name = f
# print('---正在下载第 {} 页 {} 英雄 进度{}/{}...'.format(offset, hero_name, now, len(result["List"])))
hero_url = parse.unquote(item['sProdImgNo_{}'.format(str(size))]) # 网址都被编码了,恶心
save_path = os.path.join(self.save_path, hero_name) # 图片保存路径
try: # 不是每个名字都有“-”
pic_name = split_name[1]
pic_name = re.sub(r'[【】:.<>|·@#$%^&() ]', '', pic_name)+'.jpg' # 图片名也给它标准化
except IndexError:
pic_name = hero_name+'.jpg'
save_name = os.path.join(save_path, pic_name)
if not os.path.exists(save_path):
os.makedirs(save_path)
if not os.path.exists(save_name):
with open(save_name, 'wb') as f:
response_content = self.request(hero_url.replace("/200", "/0")).content
f.write(response_content)
sys.stdout.write('\r') # 让输出不断更新
sys.stdout.write('第%s页 %s|第%s张' % (offset, '▋'*2*now, now))
offset += 1
print('\n下载完成!') @retry(stop_max_attempt_number=3)
def request(self, url):
response = requests.get(url, timeout=10)
assert response.status_code == 200
return response if __name__ == "__main__":
HonorOfKings(r'E:\win10\Pictures\电脑图片\王者荣耀壁纸').hello().run() # 这里设置图片下载根目录

加线程代码

import os, time, requests, json, re, sys

import threadpool
from retrying import retry
from urllib import parse
from tqdm import tqdm """
文章描述:爬取王者荣耀英雄壁纸+封面
使用说明:直接在最底下输入下载地址,然后运行
作者:Felix(2020/7/30 14:42)
最新修改时间:2021-4-4
公众号:【全面资源集】
博客:https://blog.csdn.net/weixin_49012647
说明:(1)使用线程爬取,但是感觉没有快多少,网址图片加载速度不是很快,而且服务器会没有响应。
(2)使用tqdm显示进度,但是该模块也会出问题,比如单位,img/s,结果变成s/img,而且加重程序负担
(3)因为是二次更改,在函数里嵌套函数,非常不专业,所有尽量少用
""" class HonorOfKings:
"""
This is a main Class, the file contains all documents.
One document contains paragraphs that have several sentences
It loads the original file and converts the original file to new content
Then the new content will be saved by this class
""" def __init__(self, save_path='./heros'):
self.save_path = save_path # 保存根目录默认在代码所在目录
self.time = str(time.time()).split('.')
self.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&iSortNumClose=1&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=%s' % \
self.time[0] # 抓包的网址 def hello(self):
"""
This is a welcome speech(欢迎界面) :return: self
"""
print("*" * 50)
print(' ' * 18 + '王者荣耀壁纸下载')
print(' ' * 5 + '公众号:【全面资源集】')
print("*" * 50)
return self def pool(self, function, arg):
"""下载线程池"""
pool = threadpool.ThreadPool(20)
request = threadpool.makeRequests(function, arg)
[pool.putRequest(req) for req in request]
pool.wait() def run(self):
"""The program entry(程序入口)"""
print('↓' * 20 + ' 格式选择: ' + '↓' * 20)
print('1.缩略图 2.1024x768 3.1280x720 4.1280x1024 5.1440x900 6.1920x1080 7.1920x1200 8.1920x1440')
size = input('请输入您想下载的格式序号,默认6:')
print()
size = size if size and int(size) in [1, 2, 3, 4, 5, 6, 7, 8] else 6 hero_list = self.request( # 下面网址是抓包获得的,暂时不会。。
'http://gamehelper.gm825.com/wzry/hero/list?channel_id=90009a&app_id=h9044j&game_id=7622&game_name=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80&vcode=12.0.3&version_code=1203&cuid=2654CC14D2D3894DBF5808264AE2DAD7&ovr=6.0.1&device=Xiaomi_MI+5&net_type=1&client_id=1Yfyt44QSqu7PcVdDduBYQ%3D%3D&info_ms=fBzJ%2BCu4ZDAtl4CyHuZ%2FJQ%3D%3D&info_ma=XshbgIgi0V1HxXTqixI%2BKbgXtNtOP0%2Fn1WZtMWRWj5o%3D&mno=0&info_la=9AChHTMC3uW%2BfY8%2BCFhcFw%3D%3D&info_ci=9AChHTMC3uW%2BfY8%2BCFhcFw%3D%3D&mcc=0&clientversion=&bssid=VY%2BeiuZRJ%2FwaXmoLLVUrMODX1ZTf%2F2dzsWn2AOEM0I4%3D&os_level=23&os_id=dc451556fc0eeadb&resolution=1080_1920&dpi=480&client_ip=192.168.0.198&pdunid=a83d20d8').json()
cover_dicts = [] # 存放字典 {封面名:封面网址}
hero_names = [] # 存放所有英雄名
cover_div = os.path.join(self.save_path, '英雄封面')
os.makedirs(cover_div)
num = 0 # 下载第几张封面,用于显示进度
all = len(hero_list['list'])
def down_corver(dict):
"""下载封面"""
global num
content = self.request(dict['cover']).content
cover_path = os.path.join(cover_div, dict['name'] + '.png')
if not os.path.exists(cover_path):
with open(cover_path, 'wb') as f: # 保存封面
f.write(content)
num += 1
sys.stdout.write('\r')
sys.stdout.write('→ → → →正在爬取封面....爬取进度:%s|%s张' % (num, all))
for i in hero_list['list']:
cover_dicts.append({i['name']: i['corver']})
hero_names.append(i['name'])
# print(cover_dicts)
for i in hero_names:
os.makedirs(os.path.join(self.save_path, i))
self.pool(down_corver, cover_dicts) page = 0
offset = 0 # 爬取的页数
total_res = self.request(self.url.format(page)).json()
# total_response = self.request(self.url.format(page)).text
# total_res = json.loads(total_response)
total_page = --int(total_res['iTotalPages']) # 所有页数
print('→ → → →开始爬取皮肤(总共 {} 页)...'.format(total_page)) def down(dict):
"""创建线程池下载"""
if '-' in dict['name']:
hero_name = dict['name'].split('-')[0] # 英雄名,创建英雄图片目录
hero_name = re.sub(r'[【】:.<>|·@#$%^&() ]', '', hero_name)
for name in hero_names:
if name in hero_name:
hero_name = name
save_path = os.path.join(self.save_path, hero_name) # 英雄皮肤保存目录
pic_name = dict['name'].split('-')[1] # 各种皮肤名
pic_name = re.sub(r'[【】:.<>|·@#$%^&() ]', '', pic_name) + '.jpg'
else:
hero_name = pic_name = dict['name']
hero_name = pic_name = re.sub(r'[【】:.<>|·@#$%^&() ]', '', hero_name)
save_path = os.path.join(self.save_path, hero_name)
save_name = os.path.join(save_path, pic_name)
hero_url = dict['url']
if not os.path.exists(save_name):
with open(save_name, 'wb') as f:
response_content = self.request(hero_url.replace("/200", "/0")).content
f.write(response_content)
tq.update(1)
time.sleep(0.4) while True:
if offset > total_page:
break
url = self.url.format(offset)
response = self.request(url).text
result = json.loads(response) # 共25页,每页20个图片,总共483张;每页英雄不同,即乱排的
# now = 0
dict_list = [] # 储存所有{英雄名:下载地址}的列表
with tqdm(total=len(result["List"]), leave=False, unit='img', ncols=100) as tq:
tq.set_description('第%s页' % offset)
for item in result["List"]:
# now += 1
hero_name = parse.unquote(item['sProdName'])
# print('---正在下载第 {} 页 {} 英雄 进度{}/{}...'.format(offset, hero_name, now, len(result["List"])))
hero_url = parse.unquote(item['sProdImgNo_{}'.format(str(size))])
dict_list.append({'name': hero_name, 'url': hero_url}) # 把所有对应英雄名及图片下载地址放进列表
self.pool(down, dict_list)
offset += 1
print('下载完成!') @retry(stop_max_attempt_number=3)
def request(self, url):
"""
Send a request :param url: the url of request
:param timeout: the time of request
:return: the result of request
"""
response = requests.get(url, timeout=10)
assert response.status_code == 200
return response if __name__ == "__main__":
HonorOfKings(save_path=r'E:\win10\Pictures\电脑图片\王者荣耀壁纸').hello().run()

更多资源请关注:【全面资源集

python 爬取王者荣耀英雄皮肤代码的更多相关文章

  1. Python爬取 | 王者荣耀英雄皮肤海报

    这里只展示代码,具体介绍请点击下方链接. Python爬取 | 王者荣耀英雄皮肤海报 import requests import re import os import time import wi ...

  2. 利用python爬取王者荣耀英雄皮肤图片

    前两天看到同学用python爬下来LOL的皮肤图片,感觉挺有趣的,我也想试试,于是决定来爬一爬王者荣耀的英雄和皮肤图片. 首先,我们找到王者的官网http://pvp.qq.com/web201605 ...

  3. python学习--第二天 爬取王者荣耀英雄皮肤

    今天目的是爬取所有英雄皮肤 在爬取所有之前,先完成一张皮肤的爬取 打开anacond调出编译器Jupyter Notebook 打开王者荣耀官网 下拉找到位于网页右边的英雄/皮肤 点击[+更多] 进入 ...

  4. Python 爬取 "王者荣耀.英雄壁纸" 过程中的矛和盾

    1. 前言 学习爬虫,最好的方式就是自己编写爬虫程序. 爬取目标网站上的数据,理论上讲是简单的,无非就是分析页面中的资源链接.然后下载.最后保存. 但是在实施过程却会遇到一些阻碍. 很多网站为了阻止爬 ...

  5. 用Python爬取"王者农药"英雄皮肤

    0.引言 作为一款现象级游戏,王者荣耀,想必大家都玩过或听过,游戏里中各式各样的英雄,每款皮肤都非常精美,用做电脑壁纸再合适不过了.本篇就来教大家如何使用Python来爬取这些精美的英雄皮肤. 1.环 ...

  6. 用Python爬取"王者农药"英雄皮肤 原

    padding: 10px; border-bottom: 1px solid #d3d3d3; background-color: #2e8b57; } .second-menu-item { pa ...

  7. python爬取王者荣耀全英雄皮肤

    import os import requests url = 'https://pvp.qq.com/web201605/js/herolist.json' herolist = requests. ...

  8. python爬虫---爬取王者荣耀全部皮肤图片

    代码: import requests json_headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win ...

  9. python 爬取王者荣耀高清壁纸

    代码地址如下:http://www.demodashi.com/demo/13104.html 一.前言 打过王者的童鞋一般都会喜欢里边设计出来的英雄吧,特别想把王者荣耀的英雄的高清图片当成电脑桌面 ...

随机推荐

  1. nginx+php-fpm docker镜像合二为一

    一.概述 在上一篇文章介绍了nginx+php-fpm,链接如下: https://www.cnblogs.com/xiao987334176/p/12918413.html nginx和php-fp ...

  2. 后端程序员之路 36、Apache Kafka

    Apache Kafkahttp://kafka.apache.org/ Kafka,很容易就联想到<海边的卡夫卡>,文艺程度和Casablanca有得一拼.Kafka是一个分布式消息系统 ...

  3. jquery通过live绑定toggle事件

    $("a[name=reply]").live("click",function(){ $(this).toggle( function () { var $c ...

  4. Vue.js 多选列表(Multi-Select)组件

    搬运公众号早前文章 多选列表 (Multi-Select) 是一种将所有选项列出,并允许用户利用 Ctrl/Shift 键进行多选的 UI 元素.这是一种常见的设计元素.有时候为了节省空间,我们会将选 ...

  5. MySQL数据库插入数据出现 ERROR 1526 (HY000): Table has no partition for value xxx

    MySQL数据库插入数据出现ERROR 1526 (HY000): Table has no partition for value xxx工作的时候发现无法插入数据,报错:ERROR 1526 (H ...

  6. 使用 SVG transform rotate 解决画框中的数字跟随旋转的问题

    问题描述 在图片上画框标注数字,旋转画布后,数字随之旋转,可读性不强,要求修改成无论画布怎么旋转,数字都是正向显示~ 原交互图示: 解决方案 先看下 dom 的结构 然后看下下面简单的代码 // 获取 ...

  7. python分离不同后缀名的文件

    功能描述 根据文件后缀名处理文件,分别拷贝到对应的文件夹下 example >>> .jpg 后缀 和.mp4 后缀文件处理 代码实现 #!/usr/bin/env python # ...

  8. 【python+selenium的web自动化】- 控制浏览器的常用操作

    如果想从头学起selenium,可以去看看这个系列的文章哦! https://www.cnblogs.com/miki-peng/category/1942527.html 前言 ​ 本文主要介绍se ...

  9. 选择 FreeBSD 而不是 Linux 的技术性原因3

    选择 FreeBSD 而不是 Linux 的技术性原因3 jail FreeBSD Jails 系统是另一个惊人的工程壮举. 在 2000 年 3 月 14 日的 4.0 版本中,FreeBSD 引入 ...

  10. C语言入门-ide的概念介绍及codeblocks编辑器安装汉化

    大家好,本章教程就ide(集成开发环境)来说一说. ide就是编译器+编辑器,原理就是在编辑器写代码,然后编辑器会让编译器来编译成二进制可执行文件. 常见的c/c++编译器有mingw64,msvc, ...