前端远原生js爬取数据的小案例

使用方法

在这里插入图片描述

注意分页的字段需要在代码里面定制化修改,根据你爬取的接口,他的业务规则改代码中的字段。比如我这里总条数叫total,人家的不一定。返回的数据我这里是data.rows,看看人家的是叫什么字段,改改代码。再比如我这里的分页叫pageNum,人家的可能叫pageNo

效果

分页下载
在这里插入图片描述

上源码

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1">
		<title>爬虫</title>
		<style>
			.container{
				width: 50%;
				margin: 50px auto;
			}
			input,
			textarea {
				height: 30px;
				width: -webkit-fill-available;
				margin-bottom: 15px;
			}

			textarea {
				height: 120px;
			}

			button {
				height: 40px;
				width: 110px;
				font-size: 18px;
			}

			#h1,
			#h2 {
				text-align: center;
			}
		</style>
	</head>
	<body>
		<div class="container">
			<div>
				接口:<input id="api" type="text" /> <br />
				请求头:<textarea id="headers" type="text" placeholder="要json格式"></textarea><br />
				参数:<textarea id="textarea" placeholder="要json格式"></textarea>
			</div>
			<div style="text-align: right;">
				<button onclick="crawling()">拉取</button>
			</div>

			<h1 id="h1"></h1>
			<h2 id="h2"></h2>
		</div>
		
		
		
		<script>
			var total = 0;
			var pageNum = 1;
			var pageSize = 30;
			var api = "";
			var headers = "";
			var textarea = "";
			const h1 = document.querySelector("#h1");
			const h2 = document.querySelector("#h2");

			async function crawling() {
				api = document.querySelector("#api").value;
				headers = document.querySelector("#headers").value;
				textarea = document.querySelector("#textarea").value;

				h1.innerHTML = "开始爬取...";
				const data = await getData();
				total = data.total;

				const page = Math.ceil(total / pageSize);
				saveFile(JSON.stringify(data.rows),`第1页 / 共${page}`);

				loading();
			}

			async function loading() {
				const page = Math.ceil(total / pageSize);
				h2.innerHTML = `一共${total}条,${page}`;
				for (let i = 1; i < page; i++) {
					pageNum++;
					h2.innerHTML = `一共${total}条,${page}页,正在第${i+1}`;
					const data = await getData();
					saveFile(JSON.stringify(data.rows),`${i+1}页 / 共${page}`);
				}

				h1.innerHTML = "爬取完毕,已下载数据";
				h2.innerHTML = "";
				total = 0;
				pageNum = 1;
			}

			async function getData() {
				const response = await fetch(api, {
					method: "POST",
					mode: "cors",
					cache: "no-cache",
					credentials: "same-origin",
					headers: {
						"Content-Type": "application/json",
						...JSON.parse(headers)
					},
					body: JSON.stringify({
						...JSON.parse(textarea),
						"pageSize": pageSize,
						"pageNum": pageNum
					})
				});
				return response.json();
			}

			function saveFile(data,name) {
				const blob = new Blob([data], {
					type: "application/json"
				});
				let link = document.createElement("a"); // 创建下载的实体标签
				link.href = URL.createObjectURL(blob); // 创建下载的链接
				link.download = name + ".json"; // 下载的文件名
				link.click(); // 执行下载
				URL.revokeObjectURL(link.href); // 下载完成释放掉blob对象
			}
		</script>
	</body>
</html>

开始在小小的网站里面爬呀爬呀爬吧…

还有一种

整体下载为一个文件

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1">
		<title>爬虫</title>
		<style>
			.container {
				width: 50%;
				margin: 50px auto;
			}

			input,
			textarea {
				height: 30px;
				width: -webkit-fill-available;
				margin-bottom: 15px;
			}

			textarea {
				height: 120px;
			}

			button {
				height: 40px;
				width: 110px;
				font-size: 18px;
			}

			#h1,
			#h2,
			#error {
				text-align: center;
			}

			#error {
				color: red;
			}
		</style>
	</head>
	<body>
		<div class="container">
			<div>
				接口:<input id="api" type="text" /> <br />
				token:<input id="token" type="text" /><br />
				参数:<textarea id="textarea" placeholder="要json格式"></textarea>
			</div>
			<div style="text-align: right;">
				<button onclick="crawling()">拉取</button>
			</div>

			<h1 id="h1"></h1>
			<h2 id="h2"></h2>
			<p id="error"></p>
		</div>



		<script>
			var total = 0;
			var datas = [];
			var pageNum = 1;
			var pageSize = 30;
			var api = "";
			var token = "";
			var textarea = "";
			const h1 = document.querySelector("#h1");
			const h2 = document.querySelector("#h2");
			const error = document.querySelector("#error");

			async function crawling() {
				api = document.querySelector("#api").value;
				token = document.querySelector("#token").value;
				textarea = document.querySelector("#textarea").value;

				h1.innerHTML = "开始爬取...";
				const res = await getData();
				if (res.code !== 0) {
					error.innerHTML = `${i}页错误`;
					return;
				}
				total = res.total;
				datas.push(res.rows);
				loading();
			};

			async function getData() {
				const response = await fetch(api, {
					method: "POST",
					mode: "cors",
					cache: "no-cache",
					credentials: "same-origin",
					headers: {
						"Content-Type": "application/json",
						Authorization: token
					},
					body: JSON.stringify({
						...JSON.parse(textarea),
						"pageSize": pageSize,
						"pageNum": pageNum
					})
				});
				return response.json();
			};

			async function loading() {
				const page = Math.ceil(total / pageSize);
				h2.innerHTML = `一共${total}条,${page}`;
				for (let i = 1; i < page; i++) {
					pageNum++;
					h2.innerHTML = `一共${total}条,${page}页,正在第${i+1}`;
					const res = await getData();
					if (res.code !== 0) {
						error.innerHTML += `${i}页错误`;
						continue;
					}
					datas.push(res.rows);
				};

				saveFile(datas);
				h1.innerHTML = "爬取完毕,已下载数据";
				reset();
			};

			function saveFile(data) {
				const blob = new Blob([JSON.stringify(datas)], {
					type: "application/json"
				});
				let link = document.createElement("a"); // 创建下载的实体标签
				link.href = URL.createObjectURL(blob); // 创建下载的链接
				link.download = "数据" + ".json"; // 下载的文件名
				link.click(); // 执行下载
				URL.revokeObjectURL(link.href); // 下载完成释放掉blob对象
			};

			function reset() {
				h2.innerHTML = "";
				total = 0;
				pageNum = 1;
				datas = [];
			};
		</script>
	</body>
</html>

在这里插入图片描述

拓展

怎么爬取微信小程序的接口?
使用Charles 拿到接口、请求头、参数,再回来使用界面爬取


node方式爬取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/328688.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【面试合集】说说微信小程序的发布流程?

面试官&#xff1a;说说微信小程序的发布流程&#xff1f; 一、背景 在中大型的公司里&#xff0c;人员的分工非常仔细&#xff0c;一般会有不同岗位角色的员工同时参与同一个小程序项目。为此&#xff0c;小程序平台设计了不同的权限管理使得项目管理者可以更加高效管理整个团…

【项目经验】详解Puppeteer入门及案例

文章目录 一.项目需求及Puppeteer是什么&#xff1f;二.Puppeteer注意事项及常用的方法1.注意事项2.常用的方法*puppeteer.launch&#xff08;&#xff09;**browser.newPage()**page.goto()**page.on(request&#xff0c;&#xff08;&#xff09;> {}&#xff09;**page.e…

(亲测可行)关于提高IDEA运行速度的方案

1.作者IDEA软件版本和计算机内存 Ultimate 2022.1.2版IDEA&#xff0c;计算机内存为12GB 2.修改配置以提高IDEA运行速度的误区-调高堆内存 很多文章会教调配置的内存&#xff0c;但大多是让你调高堆内存&#xff0c;比如会让你调高-Xms -Xmx &#xff0c;这两种对应的是最…

推荐几个Github高星GoLang管理系统

在Web开发领域&#xff0c;Go语言&#xff08;Golang&#xff09;以其高效、简洁、高并发等特性逐渐成为许多开发者的首选语言。有许多优秀的Go语言Web后台管理系统&#xff0c;这些项目星星众多&#xff0c;提供了丰富的功能和良好的代码质量。本文将介绍一些GitHub高星的GoLa…

32单片机RTC时间接续,掉电时间保存

1、实现思路 前提&#xff1a;首先要实现RTC掉电之后时间还能继续走&#xff0c;RTC电池是必要的 说明&#xff1a;设备第一次启动需要初始化配置RTC&#xff0c;但当二次启动再重新配置RTC会导致RTC计数器置零&#xff0c;所以传统的程序流程是不行的&#xff0c;我们需要知…

.sync详解记录(vue2)

.sync修饰符使用注意 在Vue.js中&#xff0c;.sync修饰符是一个非常有用的修饰符&#xff0c;它可以让父组件和子组件之间实现双向数据绑定。本文将详细介绍.sync修饰符的使用方法和原理。 什么是.sync修饰符&#xff1f; .sync修饰符是Vue.js提供的一种语法糖&#xff0c;它可…

transbigdata笔记:轨迹切片

1 方法介绍 在transbigdata笔记&#xff1a;轨迹停止点和行程提取-CSDN博客中&#xff0c;已经可以把轨迹点拆分成停止点和行程点&#xff0c;但是行程点只有起止位置&#xff0c;不包含行程轨迹信息为了进一步分析车辆的行驶轨迹&#xff0c;需要从每次行程的时间段中提取轨迹…

《2023年度程序员收入报告》 :旧金山位居第一,北京程序员中位数超60万元

2024年刚刚拉开序幕&#xff0c;备受瞩目的程序员薪资调研报告再度登场。由知名数据采集平台levels.fyi 搜集并整理了《2023年全球程序员收入报告》&#xff0c;为我们揭示了程序员最新的收入情况&#xff0c;其中有哪些值得关注的亮点呢&#xff1f; 行情向好&#xff0c;大多…

jmeter--8.加密传输

目录 1. Base64加密 2. MD5加密 3. SHA加密&#xff08;sha1\sha\sha224\sha256\sha384\sha512&#xff09; 4. RSA加密-公钥加密&#xff0c;私钥解密 1. Base64加密 1.1 在需要加密传输的接口下新增BeanShell 预处理程序&#xff0c;${username}可替换成value值&#xff…

Pycharm Terminal 无法激活conda环境

1.问题 Failed to activate conda environment. Please open Anaconda prompt, and run conda init powershell there. 这导致我们无法在Pycharm中使用conda命令 2.解决办法 修改为第二个&#xff0c;然后重启Terminal 再打开时发现已经是当前的conda环境

在客户端访问远程Linux服务器的私有IP地址的URL

文章目录 环境背景SSH tunnel和正向/反向代理步骤第一步第二步效果考一考 其它多次跳转另一种方法&#xff1a;正向代理 参考 环境 服务器&#xff1a;Ubuntu 22.04客户端&#xff1a;Mac 14.2.1 背景 在远程Linux服务器上搭建了minikube环境。minikube提供了dashboard功能&…

LLM:Scaling Laws for Neural Language Models (上)

论文&#xff1a;https://arxiv.org/pdf/2001.08361.pdf 发表&#xff1a;2020 摘要1&#xff1a;损失与模型大小、数据集大小以及训练所用计算量成比例&#xff0c;其中一些趋势跨越了七个量级以上。 2&#xff1a;网络宽度或深度等其他架构细节在很大范围内影响较小。3&…

mac pro “RESP.app”意外退出 redis desktop manager

文章目录 redis desktop manager下载地址提示程序含有恶意代码“RESP.app”意外退出解决办法&#xff1a;下载python3.10.并安装重新打开RESP如果还是不行&#xff0c;那么需要替换错误路径&#xff08;我的没用&#xff09;外传 最近在研究redis的消息&#xff0c;看到了strea…

mac查看maven版本报错:The JAVA_HOME environment variable is not defined correctly

终端输入mvn -version报错: The JAVA_HOME environment variable is not defined correctly, this environment variable is needed to run this program. Java环境变量的问题,打开bash_profile查看 open ~/.bash_profile export JAVA_8_HOME/Library/Java/JavaVirtualMachine…

Elasticsearch的基本功能和使用

Elasticsearch &#xff0c;简称为 ES&#xff0c;是一款非常强大的开源的高扩展的分布式全文 检索引擎&#xff0c;可以帮助我们从海量数据中快速找到需要的内容,它可以近乎实时的 存储、检索数据.还可以可以实现日志统计、分析、系统监控等功能. 官网:https://www.elastic.c…

Spark---累加器和广播变量

文章目录 1.累加器实现原理2.自定义累加器3.广播变量 1.累加器实现原理 累加器用来把 Executor 端变量信息聚合到 Driver 端。在 Driver 程序中定义的变量&#xff0c;在Executor 端的每个 Task 都会得到这个变量的一份新的副本&#xff0c;每个 task 更新这些副本的值后&…

利用HTML和CSS实现的浮动布局

代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>*{m…

Python武器库开发-武器库篇之Whois信息收集模块化(四十五)

Python武器库开发-武器库篇之Whois信息收集模块化(四十五) 我们在进行渗透的时候&#xff0c;需要进行全面的信息收集&#xff0c;除了主动信息收集之外&#xff0c;我们还经常会进行被动信息收集&#xff0c;Whois信息收集就是其中的一种,我们可以利用一些网站进行Whois信息收…

区间预测 | Matlab实现LSTM-Adaboost-ABKDE的集成学习长短期记忆神经网络自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现LSTM-Adaboost-ABKDE的集成学习长短期记忆神经网络自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现LSTM-Adaboost-ABKDE的集成学习长短期记忆神经网络自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一…

Java--HashMap中put()方法是如何实现的

一、什么是HashMap HashMap是Java中常用的数据结构之一&#xff0c;它基于哈希表实现&#xff0c;提供了快速的键值对存取能力。在HashMap中&#xff0c;put方法是最常用的方法之一&#xff0c;用于将键值对存储到HashMap中。本文将深入探究HashMap的put方法的实现原理&#x…