教你怎么爬元气桌面的壁纸和视频

news/2024/7/19 8:39:58 标签: node.js, 爬虫

开发语言:我大前端必备的nodejs

看成果先:

这次爬下来的是手机端视频壁纸,共848个视频

-----------------------------------下边正式开始----------------------------------

1、用fiddler抓包,查看接口地址

接口地址为:https://pcwallpaper.zhhainiao.com/v20903/wplive/list

参数为

{"login_info":{},"resolution_support":0,"wtype_support":1,"encrypt_support":"none_encrypt","page":1,"page_size":24,"cate_id":2,"tag_id":null,"sort_type":2,"common":{"open_id":"T562a73fbd3f8ccccf669fd000508da","token":"PdAOr3dfdfdfdsdf6MlC7FP5l2hZTrdTcLKsQpd","device_id":"b3e88773dsdfsdfsdfsdfaac1e61be6d","player_version":115,"platform":"pc"}}

2、点击元气桌面的图片,查看详细,抓包找到详情接口

抓到详细接口:https://pcwallpaper.zhhainiao.com/mobile/wallpaper/live/detail

参数为:

{"login_info":{},"wid":368129,"common":{"open_id":"T562a73fbdfsdrfd000508da","token":"PdAOsdfsdD6MlC7FP5l2hZTrdTcLKsQpd","device_id":"b3e88773d5d32sdfsdfac1e61be6d","player_version":115,"platform":"pc"}}

经分析,主要参数变化就是从列表中获取的 wid 参数

3、写代码,先递归获取列表中的所有wid


let getList = async opt => {

	$.post("https://pcwallpaper.zhhainiao.com/v20903/wplive/list", {
		"login_info": {},
		"resolution_support": 0,
		"wtype_support": 1,
		"encrypt_support": "none_encrypt",
		"page": opt.page,
		"page_size": 24,
		"cate_id": null,
		"tag_id": 109,
		"sort_type": 2,
		"common": {
			"open_id": "T562a73fbd3fssd000508da这里换成自己的",
			"token": "PdAOr3XqiugtdFP5l2hZT这里换成自己的d",
			"device_id": "b3e88773d5d3226d5这里换成自己的e6d",
			"player_version": 115,
			"platform": "pc"
		}
	}).then(async res => {
		if (res.data.data && res.data.data.list.length > 0) {
			for (let item of res.data.data.list) {
				let mobile_video = await getMobile({
					wid: item.wid
				})
				if (mobile_video) {
					saveVideo({msg:mobile_video+"\r\n"})
				}

			}
			console.log("第"+opt.page+"页")
			getList({
				page: opt.page + 1
			})
		} else {
			console.log(videos.length)
			console.log("结束了")
		}
	})

}

 4、拿到列表数据以后,开始请求详细接口


let getMobile = async opt => {

	let p = Q.defer();
	$.post("https://pcwallpaper.zhhainiao.com/mobile/wallpaper/live/detail", {
		"login_info": {},
		"wid": opt.wid,
		"common": {
			"open_id": "T562a73fbd3f8747e62f669fd000508da",
			"token": "PdAOr3XqiugtksuYD6MlC7FP5l2hZTrdTcLKsQpd",
			"device_id": "b3e88773d5d3226d5656eaac1e61be6d",
			"player_version": 115,
			"platform": "pc"
		}
	}).then(res => {
		if (res.data && res.data.data) {

			p.resolve(res.data.data.mobile_preview_video)
		} else {
			p.resolve("")
		}

	})
	return p.promise
}

5、最后,下载视频到本地


let saveVideo = async opt=>{
	/* learnNode.js */
	 
	
	 
	fs.appendFile('D:\\work\\test\\video.txt',opt.msg,(err)=>{
	 
	  if(err){
	 
	    console.log('出错')
	 
	  }else{
	 
	    console.log('追加内容')
	 
	  }
	 
	})
}

// getList({
// 	page: 1
// })

// $.post("https://pcwallpaper.zhhainiao.com/mobile/wallpaper/live/detail", {"login_info":{},"wid":359624,"common":{"open_id":"T562a73fbd3f8747e62f669fd000508da","token":"PdAOr3XqiugtksuYD6MlC7FP5l2hZTrdTcLKsQpd","device_id":"b3e88773d5d3226d5656eaac1e61be6d","player_version":115,"platform":"pc"}}).then(res => {
// 	console.log(res.data.data.mobile_video)
// })
let idx = 0;
let  downVideo=async opt=>{
	let p = Q.defer();
	$({
		url:opt.url,
		responseType: 'stream'
	}).then(
		(resp) => {
			idx++
			const writer = fs.createWriteStream("D:\\work\\test\\videos\\"+idx+".mp4")
			resp.data.pipe(writer)
			writer.on('finish', () => {
				console.log("完成",idx)
				p.resolve(1)
			})
			writer.on('error', (e) => {
				
				p.resolve("")
			})
		}
	)
	
	return p.promise
}

最后,有些视频链接失效了,需要处理一下,下方是完整代码,有些被注释了,因为每一步执行的时候用的的函数不一样,需要有点基础才能修改

let $ = require("axios")
const {
	async
} = require("q");
var Q = require('q');
let fs = require('fs');
let videos = []

let getList = async opt => {

	$.post("https://pcwallpaper.zhhainiao.com/v20903/wplive/list", {
		"login_info": {},
		"resolution_support": 0,
		"wtype_support": 1,
		"encrypt_support": "none_encrypt",
		"page": opt.page,
		"page_size": 24,
		"cate_id": null,
		"tag_id": 109,
		"sort_type": 2,
		"common": {
			"open_id": "T562a73fbd3f8747e62f669fd000508da",
			"token": "PdAOr3XqiugtksuYD6MlC7FP5l2hZTrdTcLKsQpd",
			"device_id": "b3e88773d5d3226d5656eaac1e61be6d",
			"player_version": 115,
			"platform": "pc"
		}
	}).then(async res => {
		if (res.data.data && res.data.data.list.length > 0) {
			for (let item of res.data.data.list) {
				let mobile_video = await getMobile({
					wid: item.wid
				})
				if (mobile_video) {
					saveVideo({msg:mobile_video+"\r\n"})
				}

			}
			console.log("第"+opt.page+"页")
			getList({
				page: opt.page + 1
			})
		} else {
			console.log(videos.length)
			console.log("结束了")
		}
	})

}


let getMobile = async opt => {

	let p = Q.defer();
	$.post("https://pcwallpaper.zhhainiao.com/mobile/wallpaper/live/detail", {
		"login_info": {},
		"wid": opt.wid,
		"common": {
			"open_id": "T562a73fbd3f8747e62f669fd000508da",
			"token": "PdAOr3XqiugtksuYD6MlC7FP5l2hZTrdTcLKsQpd",
			"device_id": "b3e88773d5d3226d5656eaac1e61be6d",
			"player_version": 115,
			"platform": "pc"
		}
	}).then(res => {
		if (res.data && res.data.data) {

			p.resolve(res.data.data.mobile_preview_video)
		} else {
			p.resolve("")
		}

	})
	return p.promise
}

let saveVideo = async opt=>{
	/* learnNode.js */
	 
	
	 
	fs.appendFile('D:\\work\\test\\video.txt',opt.msg,(err)=>{
	 
	  if(err){
	 
	    console.log('出错')
	 
	  }else{
	 
	    console.log('追加内容')
	 
	  }
	 
	})
}

 getList({
 	page: 1
 })

// $.post("https://pcwallpaper.zhhainiao.com/mobile/wallpaper/live/detail", {"login_info":{},"wid":359624,"common":{"open_id":"T562a73fbd3f8747e62f669fd000508da","token":"PdAOr3XqiugtksuYD6MlC7FP5l2hZTrdTcLKsQpd","device_id":"b3e88773d5d3226d5656eaac1e61be6d","player_version":115,"platform":"pc"}}).then(res => {
// 	console.log(res.data.data.mobile_video)
// })
let idx = 0;
let  downVideo=async opt=>{
	let p = Q.defer();
	$({
		url:opt.url,
		responseType: 'stream'
	}).then(
		(resp) => {
			idx++
			const writer = fs.createWriteStream("D:\\work\\test\\videos\\"+idx+".mp4")
			resp.data.pipe(writer)
			writer.on('finish', () => {
				console.log("完成",idx)
				p.resolve(1)
			})
			writer.on('error', (e) => {
				
				p.resolve("")
			})
		}
	)
	
	return p.promise
}

let readText = async opt=>{
	let txt = fs.readFileSync("D:\\work\\test\\video.txt","utf-8")
	let arr = txt.split("\r\n")
	console.log(arr)
	for(let item of arr){
		await downVideo({url:item})
		console.log(arr.length)
	}
}
//readText()


http://www.niftyadmin.cn/n/5016440.html

相关文章

【新版】系统架构设计师 - 软件架构设计<新版>

个人总结,仅供参考,欢迎加好友一起讨论 文章目录 架构 - 软件架构设计<新版>考点摘要概念架构的 4 1 视图架构描述语言ADL基于架构的软件开发方法ABSDABSD的开发模型ABSDMABSD(ABSDM模型)的开发过程 软件架…

【每日一题】50. Pow(x, n)

50. Pow(x, n) - 力扣(LeetCode) 实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。 示例 1: 输入:x 2.00000, n 10 输出:1024.00000示例 2: 输入&…

顾曼宁(顾曼):颠覆行业,引领共享伞新浪潮

在共享经济浪潮中,有一位勇敢的女性创业者,以其卓越的洞察力和创新思维,成为国内共享晴雨伞行业的领航者——她就是顾曼宁(顾曼)。作为行业颠覆者和蚂蚁金服战略投资的受益者,她的创业历程彰显了女性创业者…

LeetCode 1359. Count All Valid Pickup and Delivery Options【动态规划,组合数学】1722

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

《Java面向对象程序设计》学习笔记——第 15 章 Java 多线程机制

​笔记汇总:《Java面向对象程序设计》学习笔记 ​# 第 15 章 Java 多线程机制 Java 语言的一大特点就是内置了对多线程的支持。 多线程是指同时存在几个执行体,按几条不同的执行线索共同工作的情况。 我们感觉线程正在同步执行,但并不是真…

超长序列计数从值域入手(判定转状态)+分析dp状态数量:arc146_e

https://atcoder.jp/contests/arc146/tasks/arc146_e Trick1 超长序列从值域入手(判定转状态) 通过绝对值的条件,其实我们可以从小到大放每个数。 对于两个相邻的同样数 i i i,他们之间必须放 i 1 i1 i1 因此可以设计 d p…

python使用百度AipOCR来实现图像文字识别

上篇文字讲到了可以截屏手机模拟器上的界面并传回电脑上,文章链接 python将手机模拟器截屏并发送至电脑上_小小爬虾的博客-CSDN博客 传回来以后,就可以识别出图片中的文字内容了。 我使用的是Python3.10.4+百度的AipOCR库实现图像文字识别…

OpenCV(三十五):凸包检测

1.凸包检测介绍 凸包检测是计算凸包的一种技术,凸包就是:给定二维平面上的点集,将最外层的点连接起来构成的凸边形,它是包含点集中所有的点。 2.凸包检测函数convexHull() void cv::convexHull ( InputArray points, OutputArra…