Node.js爬虫的部署、调度与静态网站数据集成指南

Node.js爬虫的部署、调度与静态网站数据集成指南

本教程详细阐述如何部署和自动化运行node.js网络爬虫,实现定时数据抓取并更新静态网站内容。我们将探讨node.js脚本的服务器端运行机制、windows任务计划程序等调度工具的配置,以及爬取数据与静态html页面集成的策略,旨在帮助您构建高效且自动化的数据更新流程。

1. 理解Node.js爬虫的运行环境

首先,明确您的Node.js爬虫脚本(如index.js)是一个服务器端应用程序,它需要一个Node.js运行时环境才能执行。这与您部署静态HTML、CSS和客户端JavaScript文件的Web服务器环境有所不同。静态网站文件由浏览器直接加载和渲染,而Node.js脚本则在服务器上独立运行,执行文件操作、网络请求等任务。

这意味着您的index.js文件不能像普通的客户端JavaScript那样直接通过 标签在浏览器中运行。它需要一个安装了Node.js的操作系统(如Windows、Linux、macOS或云服务器)来启动。

2. 部署Node.js爬虫脚本

部署Node.js爬虫脚本的第一步是将其放置在一个可以访问Node.js运行时的机器上。

2.1 本地开发与测试环境

在本地进行开发和测试时,您可能会遇到跨域资源共享(CORS)问题,尤其当您尝试从本地文件系统加载JSON数据时。这是因为浏览器出于安全考虑,限制了本地文件对其他资源的访问。

用户提到的使用XAMPP解决了问题,这是因为XAMPP提供了一个本地Web服务器(Apache),当您将HTML和JSON文件都放在XAMPP的Web根目录(如htdocs)下时,它们通过localhost从同一个“源”(origin)提供服务。这样,您的HTML页面就可以通过相对路径或http://localhost/…来访问由爬虫生成的JSON文件,从而规避了CORS限制。

2.2 服务器环境部署

对于生产环境,您通常会将爬虫部署到以下类型的服务器:

云虚拟机 (Virtual Machine, VM): 如AWS EC2、Google Cloud Compute Engine、阿里云ECS或腾讯云CVM。选择操作系统: 通常选择Linux发行版(如Ubuntu, CentOS)。安装Node.js: 按照官方指南在VM上安装Node.js运行时环境。上传代码: 使用SCP、SFTP或Git将您的Node.js爬虫代码上传到VM。物理服务器: 如果您有自己的物理服务器,部署流程与云虚拟机类似。

3. 自动化调度爬虫任务

为了让爬虫每天定时运行,您需要利用操作系统的任务调度功能。

3.1 Windows任务计划程序

对于Windows服务器,可以使用“任务计划程序”来自动化执行Node.js脚本。

步骤:

打开任务计划程序: 在搜索栏输入“任务计划程序”并打开。创建基本任务: 在右侧操作栏选择“创建基本任务”。命名任务: 为任务指定一个名称(例如:“每日爬虫更新”),并添加描述。设置触发器:选择“每天”作为触发频率。设置起始日期和时间(例如,每天上午8:00:00)。确保“重复任务间隔”为“1天”。设置操作:选择“启动程序”。程序或脚本: 找到Node.js可执行文件的路径。通常在 C:Program Filesnodejsnode.exe。添加参数 (可选): 输入您的爬虫脚本的完整路径,例如 C:pathtoyourindex.js。起始于 (可选): 输入您的爬虫脚本所在的目录路径,例如 C:pathtoyour。这有助于确保脚本能正确找到其依赖文件。完成: 确认设置并完成任务创建。

3.2 Linux/macOS Crontab

对于Linux或macOS服务器,可以使用cron服务来调度任务。

打开Crontab编辑器: 在终端输入 crontab -e。

添加任务行: 在文件末尾添加一行,指定运行时间和命令。例如,每天上午8点运行:

0 8 * * * /usr/bin/node /path/to/your/index.js >> /path/to/your/cron.log 2>&1

0 8 * * *: 表示在每天的第0分钟(即整点)的第8小时运行。/usr/bin/node: Node.js可执行文件的路径,您可能需要通过 which node 命令查找。/path/to/your/index.js: 您的爬虫脚本的完整路径。>> /path/to/your/cron.log 2>&1: 将所有输出(包括错误)重定向到一个日志文件,便于调试。

保存并退出: 保存文件后,cron会自动加载新的任务。

3.3 云服务调度 (进阶)

对于更复杂的云原生应用,可以考虑使用云服务提供的调度功能:

AWS Lambda + CloudWatch Events: 将爬虫代码封装成Lambda函数,使用CloudWatch Events设置定时触发器。Google Cloud Scheduler + Cloud Functions: 类似地,使用Cloud Functions运行爬虫,并通过Cloud Scheduler进行调度。

4. 爬取数据与静态网站集成

这是将爬虫结果展示到静态网站的关键环节。由于静态网站本身无法执行服务器端逻辑,需要特定的策略来获取更新的数据。

4.1 策略一:本地文件系统同步 (适用于同服务器部署)

如果您的静态网站和Node.js爬虫部署在同一台服务器上(例如,都运行在您的本地机器上,或者一个带有Web服务器的云VM上),这是最直接的方式。

实现方式: 爬虫脚本直接将抓取到的JSON数据写入到Web服务器可以访问的静态文件目录中。

示例: 如果您的Web服务器根目录是 /var/www/html,并且您的HTML文件在 /var/www/html/index.html,那么爬虫可以将JSON文件写入 /var/www/html/data/latest.json。

HTML访问: 您的 index.html 可以通过客户端JavaScript使用 fetch 或 XMLHttpRequest 来加载这个JSON文件:

fetch('/data/latest.json')    .then(response => response.json())    .then(data => {        // 处理并显示数据        console.log(data);    })    .catch(error => console.error('Error loading JSON:', error));

这种方式利用了同源策略,因为HTML和JSON都来自同一个Web服务器。

4.2 策略二:通过API或云存储服务 (适用于分离部署)

如果您的静态网站托管在不同的平台(如GitHub Pages、Netlify、Vercel),而爬虫运行在独立的服务器上,则需要一个中间层。

实现方式:爬虫上传数据: 爬虫在抓取数据后,将其上传到一个可公开访问的云存储服务(如AWS S3、Google Cloud Storage)或一个自定义的API端点。静态网站获取数据: 您的静态HTML页面通过AJAX请求从云存储的URL或API端点获取数据。CORS处理: 如果您的静态网站和数据源(云存储或API)来自不同的域名,您需要在数据源端配置CORS头部,允许您的静态网站域名进行跨域请求。例如,在S3桶策略中添加CORS规则,或者在API服务器端设置响应头 Access-Control-Allow-Origin。

4.3 策略三:静态网站生成器与CI/CD (适用于高度自动化)

对于需要频繁更新内容且注重性能和SEO的静态网站,可以结合静态网站生成器(如Jekyll、Hugo、Next.js的静态导出)和持续集成/持续部署(CI/CD)流程。

实现方式:爬虫更新数据: 爬虫将数据保存到项目的特定位置。触发构建: 爬虫运行结束后,触发一个CI/CD流程(例如,通过Webhook通知GitHub Actions、GitLab CI/CD)。网站重新生成与部署: CI/CD流程拉取最新数据,使用静态网站生成器重新构建整个网站,然后将更新后的静态文件部署到CDN或静态托管服务。

5. Node.js爬虫示例代码分析

以下是您提供的Node.js爬虫代码,它使用Puppeteer抓取多个网站的数据并保存为JSON文件。

const puppeteer = require('puppeteer');const fs = require('fs');// 爬取第一个网站数据(async () => {  const browser = await puppeteer.launch();  const page = await browser.newPage();  await page.goto('https://br.advfn.com/investimentos/futuros/di-depositos-interfinanceiros/cotacoes',{    waitUntil: 'load', // 注意:原文是waitUntill,应为waitUntil    timeout: 0  });  const textNode = await page.evaluate(()=>{    const nodeText = document.querySelector(".even.first").innerText;    const text = [nodeText];    return text  });  fs.writeFile('arreglo2.json', JSON.stringify(textNode), err =>{    if (err) throw new Error ('algo deu errado')      console.log('deu certo')  })  await browser.close(); // 确保关闭浏览器实例})();// 爬取第二个网站数据 (DX)(async () => {  const browser = await puppeteer.launch();  const page = await browser.newPage();  await page.goto('https://br.tradingview.com/symbols/TVC-DXY/',{    waitUntil: 'load',    timeout: 0  });  const textNode = await page.evaluate(()=>{    const nodeText = document.querySelector(".js-quote-ticker.tv-site-table__row.tv-widget-watch-list__row:nth-child(2)").children[1].children[1].children[0].innerHTML;    const text = [nodeText];    return text  });  fs.writeFile('arreglo.json', JSON.stringify(textNode), err =>{    if (err) throw new Error ('algo deu errado')      console.log('deu certo')  })  await browser.close(); // 确保关闭浏览器实例})();// 爬取第三个网站数据 (美元收盘价)(async () => {  const browser = await puppeteer.launch();  const page = await browser.newPage();  await page.goto('https://br.advfn.com/bolsa-de-valores/fx/USDBRL/cotacao',{    waitUntil: 'load',    timeout: 0  });  const textNode = await page.evaluate(()=>{    const nodeText = document.querySelector(".qs-current-price").innerText;    const text = [nodeText];    return text  });  fs.writeFile('cotacaoFechamento.json', JSON.stringify(textNode), err =>{    if (err) throw new Error ('algo deu errado')      console.log('deu certo')  })  await browser.close(); // 确保关闭浏览器实例})();

代码说明:

Puppeteer: 一个Node库,提供高级API来通过DevTools协议控制Chrome或Chromium。它可以用于自动化测试、网页抓取等。puppeteer.launch(): 启动一个浏览器实例(默认是无头模式,即没有图形界面)。browser.newPage(): 在浏览器中创建一个新页面。page.goto(): 导航到指定的URL。waitUntil: ‘load’ 表示等待页面完全加载。timeout: 0 表示没有超时限制。page.evaluate(): 在浏览器页面上下文中执行JavaScript代码,并返回结果。这是从页面中提取数据的主要方式。fs.writeFile(): Node.js的文件系统模块,用于将数据写入文件。这里将抓取到的数据转换为JSON字符串后保存到本地文件。browser.close(): 非常重要! 每次抓取完成后,务必关闭浏览器实例,以释放系统资源,避免内存泄漏。在您的原始代码中缺少这一步,这可能导致长时间运行后系统资源耗尽。已在示例代码中添加。

6. 注意事项与最佳实践

错误处理与日志记录: 在生产环境中,您的爬虫脚本应该包含健壮的错误处理机制(例如,使用try…catch块)和详细的日志记录。当爬虫失败时,日志可以帮助您快速定位问题。资源管理: 确保每次Puppeteer使用完毕后,都调用 await browser.close() 来关闭浏览器实例,防止资源泄露。爬取道德与法律:遵守 robots.txt: 在抓取任何网站之前,请检查其 robots.txt 文件,了解哪些页面允许抓取,哪些被禁止。限制请求频率: 不要对目标网站发起过高的请求频率,以免对其服务器造成负担,导致IP被封禁。遵守服务条款:

以上就是Node.js爬虫的部署、调度与静态网站数据集成指南的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1598461.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
CSS选择器:精确选取父元素下最后一个特定类名子元素
上一篇 2025年12月23日 12:56:41
CSS自定义有序列表:彩色圆形数字与文本对齐的最佳实践
下一篇 2025年12月23日 12:56:54

相关推荐

  • 如何使用实例自定义脚本自定义实例的管理员账号

    本篇文章给大家带来的内容是关于如何使用实例自定义脚本自定义实例的管理员账号,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 自定义实例的管理员账号 实例自定义脚本是阿里云 ECS 为用户提供的一种自定义实例启动行为的脚本,详细信息请参考阿里云线上帮助文档:实例自定义数据。 本文档以 …

    2026年9月2日
    000
  • PC端与H5响应式项目开发:如何兼顾多屏适配及代码复用?

    PC端与H5响应式项目开发:高效策略与代码复用 移动端H5开发常借助postcss-pxtorem或postcss-px-to-viewport等工具进行屏幕适配,通常以iPhone 6为基准。但PC端网页适配策略迥异,PC端与H5兼容项目开发更具挑战性。本文探讨高效的PC端多屏适配及PC端与H5响…

    2026年9月2日
    000
  • 安全组中已经添加规则放行SSH端口的访问之后如何使用f1 RTL

    本文在介绍安全组中已经添加规则放行ssh端口的访问之后如何使用f1 rtl的基础上,重点探讨了其具体步骤,本文内容很紧凑,希望大家耐心学习。 使用f1 RTL 本文描述如何使用f1 RTL(Register Transfer Level)。 说明: 本文所述所有操作都必须由同一个账号在同一地域里执行…

    2026年9月2日
    100
  • 如何使用 Composer 简化前端资源压缩:seekgeeks/cssjsminify 库的应用

    可以通过一下地址学习composer:学习地址 在前端开发中,CSS和JavaScript文件的压缩是优化性能的关键步骤。我在处理一个项目时,发现手动压缩文件不仅耗时,还容易出错。尤其是当项目中有大量的静态资源需要处理时,效率问题变得尤为突出。幸运的是,seekgeeks/cssjsminify这个…

    用户投稿 2026年9月2日
    100
  • 如何理解迁云工具和 P2V(Physical to virtual)

    本篇文章给大家带来的内容是关于如何理解迁云工具和 p2v,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 什么是迁云工具和 P2V 迁云工具专为平衡 ECS 用户的线上线下服务器负载或者各种不同云平台之间的负载而研发。以其轻巧便捷的特点,迁云工具支持在线迁移物理机服务器、虚拟机以及其…

    2026年9月2日
    100
  • 关于基于URL发起HTTP/HTTPS GET的请求结构

    本篇文章给大家带来的内容是关于基于url发起http/https get的请求结构,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 请求结构 我们支持基于URL发起HTTP/HTTPS GET请求。请求参数需要包含在URL中。 以下为CreateSnapshot一条未编码的URL请求…

    2026年9月2日
    400
  • 如何通过 URL 发送 GET 请求调用云服务器 ECS API

    本篇文章给大家带来的内容是关于如何通过 url 发送 get 请求调用云服务器 ecs api,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 公共参数 公共参数分为 公共请求参数 和 公共返回参数。 公共请求参数 以下公共请求参数适用于通过 URL 发送 GET 请求调用云服务器 …

    2026年9月2日
    100
  • 接口调用之后如何处理返回结果

    接口调用之后如何处理返回结果接口调用之后如何处理返回结果接口调用之后如何处理返回结果接口调用之后如何处理返回结果

    本文在介绍接口调用之后如何处理返回结果的基础上,重点探讨了其具体步骤,本文内容很紧凑,希望大家耐心学习。 返回结果 返回结果主要有 XML 和 JSON 两种格式,默认为 XML,您可以指定公共请求参数 Format 变更返回结果的格式。更多详情,请参阅 公共参数。为了便于查看和美观,API 文档返…

    2026年9月2日 用户投稿
    100
  • Java中如何创建一个小型学习笔记管理工具

    答案:Java学习笔记管理工具包含Note类和NoteManager类,通过Main类实现添加、查看、搜索笔记功能,支持用户交互。 用Java创建一个小型学习笔记管理工具,关键在于结构清晰、功能实用。核心功能包括添加笔记、查看笔记、搜索笔记和保存数据。下面是一个简单但完整的实现思路和代码示例。 1.…

    2026年9月2日
    100
  • 如何使用访问控制 RAM 授权访问 ECS 实例和API 的鉴权规则

    如何使用访问控制 RAM 授权访问 ECS 实例和API 的鉴权规则如何使用访问控制 RAM 授权访问 ECS 实例和API 的鉴权规则如何使用访问控制 RAM 授权访问 ECS 实例和API 的鉴权规则如何使用访问控制 RAM 授权访问 ECS 实例和API 的鉴权规则

    本篇文章给大家带来的内容是关于如何使用访问控制 ram 授权和访问 ecs 实例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 鉴权规则 默认情况下,您能使用 ECS API 完整操作自己创建的 ECS 资源。但子账号刚创建时没有权限操作主账号的资源,或者从其他服务访问 ECS 时…

    2026年9月2日 用户投稿
    200
  • 如何在Java中开发小型库存系统

    答案:通过Java面向对象设计实现小型库存系统,包含商品类Item和库存管理类InventoryManager,使用HashMap存储商品信息,支持增删改查、入库出库操作,并提供命令行界面进行交互,适合学习基础语法与集合应用。 开发一个小型库存系统在Java中可以通过面向对象的设计思路来实现,重点是…

    2026年9月2日
    100
  • 如何一步步部署 Jeesite 微服务?

    Jeesite微服务部署指南 本文将指导您逐步部署Jeesite微服务架构。 第一步:项目准备 首先,从GitHub克隆Jeesite项目:git clone https://github.com/jeesite/jeesite,然后进入项目目录:cd jeesite。 第二步:启动服务注册中心 使…

    2026年9月2日
    200
  • 如何查询一台 ECS 实例的 Web 管理终端 地址

    本篇文章给大家带来的内容是关于如何查询一台 ecs 实例的 web 管理终端 地址,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 DescribeInstanceVncUrl 查询一台 ECS 实例的 Web 管理终端 地址。 描述 调用该接口时,您需要注意: 管理终端地址的有效期…

    2026年9月2日
    500
  • 怎么以 Base64 编码的方式查询一台 ECS 实例的 自定义数据

    本篇文章给大家带来的内容是关于怎么以 base64 编码的方式查询一台 ecs 实例的 自定义数据,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 DescribeUserdata 查询一台 ECS 实例的 自定义数据。 描述 返回的实例自定义数据将以 Base64 编码的方式显示。…

    2026年9月2日
    200
  • 如何查询一台或多台预付费实例自动续费状态

    本篇文章给大家带来的内容是关于如何查询一台或多台预付费实例自动续费状态,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 DescribeInstanceAutoRenewAttribute 查询一台或多台预付费实例自动续费状态。 描述 为了方便您了解自己的实例是否为自动续费状态,本接…

    2026年9月2日
    100
  • 怎么查询一台或者多台 ECS 实例上的已赋予的 实例 RAM 角色

    本文在介绍怎么查询一台或者多台 ecs 实例上的已赋予的 实例 ram 角色的基础上,重点探讨了其具体步骤,本文内容紧凑,希望大家可以有所收获。 DescribeInstanceRamRole 请求参数 返回参数 示例 请求示例 https://ecs.aliyuncs.com/?Action=De…

    2026年9月2日
    100
  • 前端颜色选择:用Autocomplete还是标签更优雅?

    前端开发中,优雅的颜色选择器实现一直是开发者关注的焦点。本文探讨如何通过输入框结合下拉列表,实现图示效果,并分析使用Autocomplete的必要性。 目标是创建一个仅显示颜色样本的小型输入框,并通过下拉菜单提供颜色选项。虽然Autocomplete常用于文本自动补全,但直接用HTML标签实现颜色选…

    2026年9月2日
    200
  • 如何查询抢占式实例近 30 天内的历史价格

    如何查询抢占式实例近 30 天内的历史价格如何查询抢占式实例近 30 天内的历史价格如何查询抢占式实例近 30 天内的历史价格如何查询抢占式实例近 30 天内的历史价格

    本篇文章给大家带来的内容是关于如何查询抢占式实例近 30 天内的历史价格,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 DescribeSpotPriceHistory 请求参数 返回参数 示例 请求示例 https://ecs.aliyuncs.com/?Action=Descr…

    2026年9月2日 用户投稿
    400
  • 主流电脑操作系统一览

    主流电脑操作系统一览主流电脑操作系统一览主流电脑操作系统一览主流电脑操作系统一览

    提到操作系统,大多数人首先想到的是电脑系统,例如微软的windows xp或windows 7。操作系统(简称os)是用于管理计算机硬件和软件资源的核心程序。当前主流的电脑操作系统包括windows、macos、linux等,各类系统在功能、界面和应用场景上各有特点,广泛应用于个人电脑、服务器及开发…

    2026年9月2日 用户投稿
    300
  • 调整一台按量付费实例的实例规格和公网带宽大小

    调整一台按量付费实例的实例规格和公网带宽大小调整一台按量付费实例的实例规格和公网带宽大小调整一台按量付费实例的实例规格和公网带宽大小调整一台按量付费实例的实例规格和公网带宽大小

    本篇文章给大家带来的内容是关于调整一台按量付费实例的实例规格和公网带宽大小,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 ModifyInstanceSpec 调整一台按量付费实例的实例规格和公网带宽大小。 描述 调用该接口时,您需要注意: 实例必须处于无欠费状态。 实例状态必须为…

    2026年9月1日 用户投稿
    100

发表回复

登录后才能评论
关注微信