王者壁纸批量爬取

news/2024/11/29 5:27:58/

语言:python

json格式网站

爬取网址:王者荣耀壁纸下载-王者荣耀官方网站-腾讯游戏

思路分析

分析下一页,发现下一页之后是在当前页面的局部重新加载

当然排除可以直接爬取目标url获取当前页面的信息以及后面的所有目标图像的链接

打开谷歌浏览器自带的调试工具,抓包

 然后咱们清除所有记录,刷新第二页

你很清楚的看到一共有三次请求,第二次请求就是这几张壁纸,不难推测出第一次请求有我们想要的答案,打开第一个包,并分析他的响应,打开分析json工具,格式化

 这里有明显需要进行url解码,进行Unicode转中文,发现有二进制内容再进行中文转Unicode(其实我也不懂为啥需要再进行中文转Unicode才可以把皮肤名搞出来),之后结果就是这样

 

 然后很清晰目标url,以及壁纸的名称都有了,然后一看正好是一页的全部壁纸的

目标壁纸的URL已经发现是在请求包里面,现在无非分析请求URL有什么不同

随便打开两页的请求js的载荷

 可以看出有个量为page正好对应页码且变换页码也就这个值在发生改变(_:也在改变但是不重要可以舍弃)那么目标请求的URL可以得出。

完整思路:

对含壁纸名称和壁纸URL的URL发起请求 —>得到含壁纸名称和壁纸URL的js包—>对包内数据进行处理得到一个包含名称和url的列表—>对列表内url发起请求得到二进制数据—>保存数据

代码实现:

得到目标URL序列:

    link = []for i in range(0,10):urllib = "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&jsoncallback=jQuery171008024345318143489_1643000887986&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735".format(str(i))head = {"user-agent": "",#UA伪装"cookie":"",#自己的cookie值"referer": "https://pvp.qq.com/"}reponse = requests.get(urllib, headers=head).textreponse = parse.unquote(reponse)imglink = re.findall('"sProdImgNo_3":"(.*?)200"', reponse)name = re.findall('"sProdName":"(.*?)"', reponse)for i in range(len(name)):dirt = {"img":imglink[i]+"0","name":name[i]}link.append(dirt)

对目标URL进行访问,且保存二进制图片

 print(dirt['name'],"正在下载……")url = dirt['img']head = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36"}async  with aiohttp.ClientSession() as session :async with await session.get(url,headers = head) as reponse:img = await reponse.read()with open("./王者荣耀/"+dirt['name']+".jpg","wb") as op:op.write(img)print(dirt['name'],"下载完毕!!!")

完整代码(为了提高速度使用了多任务异步):

import re
import requests
import aiohttp
import asyncio
from urllib import parse
def getLink():link = []for i in range(0,10):urllib = "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&jsoncallback=jQuery171008024345318143489_1643000887986&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735".format(str(i))head = {"user-agent": "",#UA伪装"cookie":"",#自己的cookie值"referer": "https://pvp.qq.com/"}reponse = requests.get(urllib, headers=head).textreponse = parse.unquote(reponse)imglink = re.findall('"sProdImgNo_3":"(.*?)200"', reponse)name = re.findall('"sProdName":"(.*?)"', reponse)for i in range(len(name)):dirt = {"img":imglink[i]+"0","name":name[i]}link.append(dirt)return link
async def askUrl(dirt):print(dirt['name'],"正在下载……")url = dirt['img']head = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36"}async  with aiohttp.ClientSession() as session :async with await session.get(url,headers = head) as reponse:img = await reponse.read()with open("./王者荣耀/"+dirt['name']+".jpg","wb") as op:op.write(img)print(dirt['name'],"下载完毕!!!")
if __name__ == "__main__":tasks = []link = getLink()for i in link:c = askUrl(i)task = asyncio.ensure_future(c)tasks.append(task)loop = asyncio.get_event_loop()loop.run_until_complete(asyncio.wait(tasks))

执行结果:

 

小白水平有限,如有问题还请指出包含


http://www.ppmy.cn/news/454990.html

相关文章

【Android】-- 如何对APP版本控制/更新?

目录 一、 前提准备 1、获取服务器 2、使用工具操作云服务器 二、Json格式网页 三、创建file_paths.xml及修改AndroidManifest.xml 四、在java代码加入更新检测代码 效果如图: 可以强制更新和非强制更新,和浏览器下载安装包。 一、 前提准备 1、获取…

Gin教程--路由与控制器设计(三)

一、路由设计 1.1 介绍 1.1.1 什么是路由 路由就是URL到函数的映射,确定数据交换和页面展现的目标。 1.1.2 什么是路由组 就是相同路由前缀的路由集合,例如/admin下可以有用户、设置等等。 1.2 请求方式 请求方式介绍备注GetGet请求,一般…

0001-TIPS-2020-hxp-kernel-rop : ret2user

目的 理解系统调用的过程:从用户态进入内核态,再从内核态返回用户态。细节见文末的参考了解一般性提权方法commit_creds(prepare_kernel_cred (0)); 环境搭建 下载 pwn 2020-kernel-rop wget https://2020.ctf.link/assets/files/kernel-rop-bf9c106…

非连续内存上执行计算操作,和连续内存上执行计算操作有什么效率上的区别?

在计算机内存中,数据可以存储在连续(contiguous)或非连续(non-contiguous)的内存区域。两者在执行计算操作时的效率上存在一定的区别。 连续内存上执行计算操作的优势: 缓存局部性:处理器缓存…

在Centos Stream 9上Docker的实操教程(六) - Docker Compose容器编排详解

在Centos Stream 9上Docker的实操教程 - Docker Compose容器编排详解 前言什么是Docker-Compose下载安装和卸载使用仓库安装手动安装卸载 docker compose常用命令项目实战构建SpringBoot项目编写Dockerfile文件编写Docker-Compose.yml文件 运行测试相关注意事项结语 前言 在了…

Rust动态数组存放不同类型元素

文章目录 Rust动态数组存放不同类型元素前言1.1 使用枚举类型实现1.2 通过特征对象实现 Rust动态数组存放不同类型元素 前言 Vec<T>动态数组类型&#xff0c;是rust的基本集合类型&#xff0c;他只能存放同类型的元素。 如 vec![1, 2, 5, 18]&#xff0c;但是如果vec![…

揭开生成式人工智能的力量:60+医疗保健应用场景

预计生成式AI在医疗保健领域的增长速度将超过任何其他行业。在医疗技术领域&#xff0c;AI可带来更高效流程、个性化客户互动、更大的创新和更高价值。为了帮助领导者理解这些机会&#xff0c;BCG最近研究了医疗技术中生成式AI的60多个应用场景&#xff1a;从产研和软件开发到业…

Autosar软件组件-Application Layer介绍和SWC(Software Component)类型

参考前文Autosar-软件架构,可知整个架构从上到下分层依次为:应用层(Application Software Layer),运行时环境(Runtime Environment,RTE),基础软件层(Basic Software Layer,BSW),微控制器(Microcontroller)。 Application Layer由各种AUTOSAR Software Componen…