1、准备工作

Python 3.7

Python安装有requests模块

王者荣耀官网地址:https://pvp.qq.com/web201605/wallpaper.shtml###

2、网站分析

由于现在的电脑分辨率基本都是1920x1080,所以这里以此分辨率作为例子

2.1、首先我们分析同一图片,不同分辨率的图片,我们对比他们的相同点和不同点。下面以庄周·奇妙博物学为例,打开他的不同分辨率的照片,查看他的url地址

1920x1080:http://shp.qpic.cn/ishow/2735030613/1551850681_-695593207_28893_sProdImgNo_6.jpg/0

1400x900:http://shp.qpic.cn/ishow/2735030613/1551850681_-695593207_28893_sProdImgNo_5.jpg/0

1920x1200:http://shp.qpic.cn/ishow/2735030613/1551850682_-695593207_28893_sProdImgNo_7.jpg/0

对比以上三个url地址可以看出,图片分辨率的是sProdImgNo的号码不同,爬取不同的分辨率我们只需要更改后面的号码就可以了。

2.2、下面我们来分析相同分辨率不同角色图片

庄周·奇妙博物学:http://shp.qpic.cn/ishow/2735030613/1551850681_-695593207_28893_sProdImgNo_6.jpg/0

1:1等身雕塑·凯:http://shp.qpic.cn/ishow/2735022611/1551150496_-695593207_2194_sProdImgNo_6.jpg/0

盘古·创世神祝:http://shp.qpic.cn/ishow/2735021914/1550557556_1186005513_23586_sProdImgNo_6.jpg/0

这里我们可以看到,出了前面相同的域名和后面表示高清的图像分辨率参数之外,再结合2.1的对比,中间的这一串数字参数我想大概就是表示图片的id了,但是我们要批量爬取,就必须要找出所有图片中间这一串id的分布规律,这里我按照图片的显示顺序连续点开了几个,并没有发现比较明显的规律。

2.3、接下来我点击了下面的翻页按钮,发现每翻一页,网站的整个页面并没有全部被刷新,只有显示图片的这一部分被刷新。那么在点击到第几页的时候,肯定是响应了某个函数向服务器发送了get或者post请求,然后服务器只传回了下一页图片的相关信息。这就简化了我们的操作步骤,我们只需要模拟这一个请求,服务器就会传回图片信息。接下来做如下操作:

我们看到当我们点击到第二页的时候,浏览器向服务器只发送了一个网络请求,所以这个请求就是我们获取图片地址的关键。由于是get方法,我们只需要把这个url贴到浏览器地址栏,就能得到服务器传回的信息。

上图可以看到服务器传回了一堆很长的字符串,我这里用postman重新请求了一下,如下图:

看起来比浏览器上稍微工整了一点,的但还是不太容易读,可以看出他是一个jQuery数据包,里面封装的是一个json数据包,于是我换成了json格式的页面,一下格式就变得非常明显

从这个数据包里我们可以看到他的List参数里面,每一个List,都封装了一个图片的信息,而这一个List里面,有20个数据,对应了一页的20张图片。而对我们来说,需要的就只有下载图片的地址和保存图片时需要的图片名称,由前面的分析,我们只需要每个List的这两个参数,如下图:

当然对应不同的分辨率,我们可以选择不同的sProdImgNo参数。

2.4、由2.3我们可以得到想要的参数值,但是这个参数值是经过编码隐藏的,如果不进行解析,我们将不能直接使用。我们先来观察图片的地址:

加密地址:"http%3A%2F%2Fshp%2Eqpic%2Ecn%2Fishow%2F2735012213%2F1548136530%5F%2D695593207%5F9275%5FsProdImgNo%5F6%2Ejpg%2F200"

真实地址:http://shp.qpic.cn/ishow/2735012213/1548136530_-695593207_9275_sProdImgNo_6.jpg/0

这里我们仔细对比这个加密地址和真实的地址,有一部分是我们看的懂的,有一部分又是看不懂的,再与其他地址对比,得出了以下解密表:

'%3A'==>':'      '%2F'==> '/'     '%2E'==>'.'    '%5F'==> '_'    '%2D'==> '-'     '200'==>'0'

以上是url的解密,这个在接收后只需要进行字符串的替换就可以解决。但是图片名字并不是这样的编码。这里他使用了函数编码,所以只能用函数解码,在python中,可以使用unquote(String)来进行解码。对应的地址为urllib.parse.unquote(String)

2.5、上面我们解决了获得一页图片链接的方法,但是我们想要的不只是一页数据,因此我们接下来要分析的是多页的请求。

连续请求了2、3、4页的数据,对比他们的请求参数 ,以上是三个请求的区别。第一个page参数就代表页数,第一页的值为0,往后依次增加。第二个参数jsoncallback其实就是上面我们收到的jQuery包的包头,他最后一位的数值会随着请求的次数进行加1,最后一位其实是当前的时间戳。经过请求实践发现,如果去掉jsoncallback参数,收到的数据将会是去掉外层jQuery包的纯json数据,最后一个时间戳的参数同样也可以不传。所以需要哪一页的数据,只需要更改page的参数值就可以了。使用时就可以用如下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={页码-1}&iOrder=0&iSortNumClose=1&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735

3、源码

from urllib import request, parse
import requests# 设置request代理服务器
proxy_support = request.ProxyHandler({'http': 'http://xx.xx.xx.xx:xx'})
opener = request.build_opener(proxy_support, request.HTTPHandler)
request.install_opener(opener)# 设置requests代理服务器
ip, port = ("125.126.222.12", "9999")
proxy_url = "http://{0}:{1}".format(ip, port)
proxy_dict = {'https': proxy_url,
}class wzry(object):def __init__(self):self.page = 0  # 抓取的起始页self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64)'}# 伪装成浏览器def get_page(self):try:while self.page <= 10:   # 设置抓取的结束页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='+str(self.page)+ '&i' \'Order=0&iSortNumClose=1&iAMSAc'\'tivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&'\'iActId=2735&iModuleId=2735&_=1554873059538'self.page = self.page + 1req = request.Request(url, headers=self.headers)response = request.urlopen(req)data = response.read()list_data = eval(data)['List']for ls in list_data:# 抓取图片url并替换特殊符号sProdImgNo_6 = ls['sProdImgNo_6'].replace('%3A', ':').replace('%2F', '/').replace('%2E', '.').replace('%5F', '_').replace('%2D', '-').replace('200', '0')sProdName = ls['sProdName']img_name = parse.unquote(sProdName) # 解码字符串img = requests.get(sProdImgNo_6, proxies=proxy_dict, verify=False)  # 抓取图片print(f'正在抓取 {img_name} 高清皮肤......')# 写入文件with open(f'G:/wzry/{img_name}.jpg', 'wb') as f:f.write(img.content)except request.URLError as e:if hasattr(e, 'reason'):print(f'抓取失败,失败原因:{e.reason}')class  main():wzry().get_page()if __name__ == '__main__':main()print('抓取完成。。。')

注意:请求url的时候一定要设置代理服务器,因为连续大量的请求,服务器会认为这是黑客攻击,会拒绝你当前ip的连接,导致请求失败,严重的话服务器会把你的ip或者与你同网段的ip地址拉入黑名单,导致一段时间无法访问连接。

下面附上成果图:

如何爬取王者荣耀高清壁纸(详细分析教程)相关推荐

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

    一.前言 打过王者的童鞋一般都会喜欢里边设计出来的英雄吧,特别想把王者荣耀的英雄的高清图片当成电脑桌面 预览一下桌面吧: 是不是看着这样的桌面也很带感,_ (学会这个技术,你可以爬取其他网站的类似图片 ...

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

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

  3. Python多线程爬虫之二:爬取王者荣耀高清壁纸(多线程)

    一.项目分析 1.查询爬取网址 robots 权限 1.王者荣耀官网:https://pvp.qq.com/ 2.访问王者荣耀官网 rbots 权限: https://pvp.qq.com/robot ...

  4. python多线程爬取王者荣耀高清壁纸过程

    多线程与爬虫 目标url json中查找url 访问url 读取json 查看json的list数组 全部图片 粗暴的单线程获取 多线程执行 目标url 查看http://pvp.qq.com/web ...

  5. 爬取王者荣耀高清皮肤

    爬虫中使用多线程爬虫是一种很常见的方式,可以提高爬取的效率,特别是生产者消费者模型也经常可以见到,今天刚好学习了这种模式,爬取下王者荣耀的高清壁纸,作为练习 import requests from ...

  6. python爬取王者荣耀高清图

    原理请看:Python?30行代码?爬取王者荣耀所有英雄皮肤图片?_易果啥笔的博客-CSDN博客 我稍微改了一下:因为王者这个herolist.json文件里的信息更新的不太及时,导致爬取出来的皮肤有 ...

  7. 简单爬取wallpaper heaven高清壁纸(福利满满~)

    简单爬取wallpaper heaven高清壁纸 2021年1月30日更新 由于网站架构更改,以下内容已经并不能再实现爬取 思路大体不变,仅供参考思路 前言:wallpaper heaven是一个拥有 ...

  8. python手机壁纸超清_Python爬虫-王者荣耀高清壁纸下载

    绪论 网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.python是一种跨平台的计算机程序设计语言.是一种 ...

  9. 爬虫 | 王者荣耀高清壁纸-多线程

    # CY3761 | 2021-11-04 18:23 import json import os import queue import time import urllibimport reque ...

最新文章

  1. DWRUtil的方法使用说明
  2. 数学建模 概率空间与统计结构
  3. 前向渲染路径细节 Forward Rendering Path Details
  4. 《剑指offer》和为s的连续正数序列
  5. Linux用系统命令杀死僵尸进程
  6. web语义化方便了谁?
  7. Outlook 2003解除附件下载限制
  8. 备份容灾相关概念总结
  9. 自然语言处理——分词算法
  10. v3是c语言吗 yolo_你真的明白yolo v3吗?
  11. 电脑显示器黑屏|显示器突然黑屏|显示器闪黑屏
  12. pr剪辑打开多个项目_写给后期剪辑新手的PR软件基础操作全流程指南
  13. 学习,不仅要知其然,更要知其所以然。
  14. 《信心——是什么?导致什么?》_司布真
  15. uboot启动流程详解
  16. 成功解决wps文档中输入英文单词出现对应英文单词下边红色波浪线(英文拼写自动检测)去掉或加上图文教程
  17. php inet_aton(),如何通过mysql 利用inet_aton和inet_ntoa来处理ip地址数据
  18. JetBrains-License-Server
  19. 多路复用,讲的很明白
  20. MuMu模拟器网络连接异常如何处理?

热门文章

  1. vscode python插件_黄哥Python:VS Code 10个Python 插件
  2. 基于微信的座位预约预订小程序(java后台springboot框架)、毕业设计、开题报告、毕业论文参考(4)开发概要
  3. 关于设计一个群发短信的小程序
  4. 如何立即将Windows Phone升级到Windows 10
  5. 学习笔记(01):巫妖王51单片机开发板配套视频课程-查询方式矩阵按键
  6. centos amd双显卡_双11来临AMD性价比游戏笔记本如何选择?看完分析有答案
  7. 找规律: 1,2,9,64,625,()
  8. 魅族18pro和三星s21哪个好
  9. [复试经验]跨考浙大计算机研究生_实验室面试_教训谈
  10. Android手机部分名词浅谈