超简单的node爬虫小案例

news2024/12/24 8:11:45

同前端爬取参数一样,输入三个参数进行爬取

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

在这里插入图片描述
data目录手动建立上哦,要放爬下来的数据

依赖

{
  "dependencies": {
    "axios": "^1.6.5",
    "colors": "^1.4.0",
    "fs": "^0.0.1-security",
    "readline": "^1.3.0"
  }
}

代码

const readline = require("readline");
const axios = require('axios');
const fs = require("fs");
const colors = require('colors');


// 创建询问实例
let RL = readline.createInterface({
    input: process.stdin,
    output: process.stdout
})

// 封装异步询问
function question(question) {
    return new Promise((resolve, reject) => {
        RL.question(`${question}\t`, function (value) {
            return resolve(value);
        })
    })
}


var total = 0;
var pageNum = 1;
var pageSize = 30;
var api = "";
var headers = "";
var params = "";




// 循环异步方法,执行同步结果
(async function () {
    const questions = ["请输入接口:", "请输入请求头:", "请输入参数:"];
    for (let i = 0; i < questions.length; i++) {
        const value = await question(questions[i]);
        if (i === 0) {
            api = value;
        } else if (i === 1) {
            headers = value;
        } else {
            params = value;
        }
    }
    RL.close();
})()

// 监听readline关闭,结束终端输入
RL.on("close", function () {
    console.log(`<<<------------------------- 开始爬取 ------------------------->>>\n`.blue);
    // console.log(api, headers, params);
    crawling();
})


// 封装接口请求
async function getData() {
    const response = await axios({
        url: api,
        method: "post",
        headers: {
            "Content-Type": "application/json",
            ...JSON.parse(headers)
        },
        data: JSON.stringify({
            ...JSON.parse(params),
            "pageSize": pageSize,
            "pageNum": pageNum
        })
    })
    return response.data;
}

// 爬取执行入口
async function crawling() {
    const data = await getData();
    console.log(data);
    if (data.code !== 0) {
        console.log('================= 数据读取失败 ================='.red);
        process.exit(0);
    }

    console.log('================= 数据读取成功 ================='.green);
    total = data.total;
    const page = Math.ceil(total / pageSize);
    console.log(`${page}`);
    saveFile(data.rows, `第1页`);
    loading();
}

// 持续执行爬取
async function loading() {
    const page = Math.ceil(total / pageSize);
    for (let i = 1; i < page; i++) {
        pageNum++;
        const data = await getData();
        saveFile(data.rows, `${i + 1}`);
    }

    console.log(`<<<------------------------- 爬取完毕,已下载数据 ------------------------->>>\n`.bgGreen);
    total = 0;
    pageNum = 1;
    process.exit(0);
}



// 下载json文件
function saveFile(res, name) {
    console.log(`<<<------------------------- 开始写入 ------------------------->>>\n`.blue);
    console.log(name);
    const writerStream = fs.createWriteStream("data/" + name + ".json");
    writerStream.write(JSON.stringify(res));
    writerStream.end();

    writerStream.on('finish', function () {
        console.log(`<<<------------------------- 写入完成 ------------------------->>>\n`.green);
    });
    writerStream.on('error', function (err) {
        console.log(err);
        console.log(`<<<------------------------- 写入错误 ------------------------->>>\n`.red);
        process.exit(0);
    });
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

存内计算技术打破常规算力局限性

目录 前言 关于存内计算 1、常规算力局限性 2、存内计算诞生记 3、存内计算核心 存内计算芯片研发历程及商业化 1、存内计算芯片研发历程 2、存内计算先驱出道 3、存内计算商业化落地 基于知存科技存内计算开发板ZT1的降噪验证 &#xff08;一&#xff09;任务目标以…

linux-部署Samba文件共享服务

linux-部署Samba文件共享服务 1、使用命令安装samba服务和samba客户端 dnf install samba samba-client # 或者 yum install samba samba-client2、配置文件的设置(可提前备份smb.conf) vim /etc/samba/smb.conf [global]workgroup SAMBAsecurity userpassdb backend tdbsam…

芯品荟|电梯外呼面板屏驱市场调研报告

PART ONE 产品简介 - Introduction - 1.电梯外呼面板介绍 电梯外呼面板&#xff0c;用于显示电梯当前位置、运行状态和楼层信息&#xff0c;以便乘客在等待电梯时了解电梯的运行情况。 电梯外呼面板&#xff0c;按显示屏的种类&#xff0c;分为3类&#xff0c;分别是LED屏、L…

Linux Mii management/mdio子系统分析之二 mdio总线-设备-驱动模型分析

Linux Mii management/mdio子系统分析之二 mdio总线-设备-驱动模型分析 &#xff08;转载&#xff09;原文链接&#xff1a;https://blog.csdn.net/u014044624/article/details/123303139 接着上篇文章继续分析mdio子系统&#xff0c;本章主要介绍mdio子系统的驱动模型&#xf…

3.3.2 CSMA/ CD协议

3.3.2 CSMA/ CD协议 CSMA/CD&#xff08;Carrier Sense Multiple Access with Collision Detection&#xff09;&#xff1a;载波监听多点接入/碰撞检测。 检测到碰撞后&#xff1a; 适配器立即停止发送。&#xff08;碰撞点后面的信号会一直叠加&#xff09;等待一段随机时间…

【AI】 AIOTSummary

智能物联网(AIoT)是2018年兴起的概念,指系统通过各种信息传感器实时采集 各类信息(一般是在监控、互动、连接情境下的),在终端设备、边缘域或云中心 通过机器学习对数据进行智能化分析,包括定位、比对、预测、调度等。智能物联网(AIoT)是2018年兴起的概念,指系统通过…

你还没脱单,这些软件都得背锅

不管你是否认可情人节概念&#xff0c;是否会在这天与自己的那个ta相聚&#xff0c;每个成年人都会或多或少地思考自己的感情问题。 在互联网兴盛之前&#xff0c;人与人的交往大都依靠职场关系和熟人介绍来结识新的对象&#xff0c;但也有媒人、婚姻介绍所等专门的职业为适龄…

服务异步通讯——springcloud

服务异步通讯——springcloud 文章目录 服务异步通讯——springcloud初始MQRabbitMQ快速入门单机部署1.1.下载镜像安装MQ SpringAMQPwork Queue 工作队列Fanout Exchange广播模式DirectExchange路由模式TopicExchange话题模式 消息转换器 初始MQ RabbitMQ快速入门 官网https:/…

科研绘图(八)线性热图

线性热图&#xff08;Linear Heat Map&#xff09;是一种数据可视化技术&#xff0c;用于展示数值在一维线性空间上的分布情况。它通常用于展示沿着一条线&#xff08;例如时间线或任何一维序列&#xff09;的数据密度或强度变化。线性热图与传统的二维热图不同&#xff0c;后者…

Sectigo多域名通配符证书买一年送一个月

Sectigo随着互联网的发展也在飞速发展&#xff0c;旗下颁发了多种单域名SSL证书、多域名SSL证书和通配符SSL证书产品。Sectigo旗下的SSL证书产品丰富&#xff0c;为了满足一些域名多&#xff0c;子域名也比较多的企事业单位的需求&#xff0c;推出了一种多域名通配符SSL证书。今…

Linux内核架构和工作原理详解(一)

简介 作用是将应用层序的请求传递给硬件&#xff0c;并充当底层驱动程序&#xff0c;对系统中的各种设备和组件进行寻址。目前支持模块的动态装卸(裁剪)。Linux内核就是基于这个策略实现的。Linux进程1.采用层次结构&#xff0c;每个进程都依赖于一个父进程。内核启动init程序…

simulink之state

状态 状态描述了无功系统的运行模式。在Stateflow图表中&#xff0c;状态用于顺序设计&#xff0c;以创建状态转换图。 状态可以是激活状态&#xff0c;也可以是非激活状态。一个状态的激活或不激活可以根据事件和条件而变化。事件的发生通过使状态变为激活或非激活来驱动状态…

跨境电商多账号防关联攻略分享,盘点那些可以多账号登录的指纹浏览器

在跨境电商行业中&#xff0c;卖家常常需要在电商平台上同时运营多个店铺&#xff0c;但像亚马逊这样的平台都禁止同一个卖家在同一个站点上开设多家店铺&#xff0c;这一做法也常常会带来账号关联的风险&#xff0c;而关联的后果可能非常严重。那么拥有多个账号的跨境卖家应该…

多级缓存(nginx本地缓存、JVM进程缓存、redis缓存)

文章目录 整体示意图1.nginx缓存2.进程缓存Caffeine示例 3.Lua语法(为了在nginx中做编程)4.OpenResty5.封装向Tomcat发送的Http请求&#xff0c;获取数据6.Tomcat集群的负载均衡7.redis缓存8.查询Redis缓存9.Nginx本地缓存 整体示意图 1.nginx缓存 2.进程缓存 Caffeine示例 3.…

多级缓存架构(二)Caffeine进程缓存

文章目录 一、引入依赖二、实现进程缓存1. 配置Config类2. 修改controller 三、运行四、测试 通过本文章&#xff0c;可以完成多级缓存架构中的进程缓存。 一、引入依赖 在item-service中引入caffeine依赖 <dependency><groupId>com.github.ben-manes.caffeine…

企业内部知识库搭建方法,一般人都不知道

让我们想象一下&#xff0c;你是一家创业公司的创始人或者是已有企业的CEO&#xff0c;你是否遇到过这样的问题&#xff0c;公司的员工有时候互相之间的信息交流不够顺畅&#xff0c;不同部门之间的知识沟通不够清晰&#xff1f; 或者是新加入的员工刚开始工作几个月都处在一个…

网络部署实战具体学习内容总结

网络部署实战具体学习内容总结 &#x1f4bb;网络部署实战课程通常旨在教授学生如何规划、配置、维护和优化计算机网络。这些课程涵盖了广泛的主题&#xff0c;以确保学生具备网络部署和管理所需的技能。 网络部署实战课程具体学习内容&#x1f447; 1️⃣网络架构设计及网络原…

遥测终端机选择要点:功能、稳定性与成本的综合考量

在当今的智能化时代&#xff0c;遥测终端机作为数据采集、传输和处理的关键设备&#xff0c;广泛应用于水利、气象、环保等领域。然而&#xff0c;面对市场上琳琅满目的遥测终端机产品&#xff0c;如何选择一款性能优良、稳定性高且成本合理的设备成为摆在用户面前的一大难题。…

第一篇:node的背景及版本的检查

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 前言 Node.js 是一个基于 Chrome V8 JavaScript 引擎…

制造业CRM系统选型技巧-这四个功能更加重要

目前&#xff0c;促进制造业数字化转型是时代的发展方向。为了实现这一趋势&#xff0c;CRM管理系统在制造业中的运用至关重要。那样&#xff0c;制造业CRM应该如何选择呢&#xff1f;高度关注这种业务艰难和解决方案&#xff1a;全方位客户管理、灵便订制作用、高效客户服务以…