新闻中心
部署与调度Node.js爬虫:从本地执行到云端集成

本教程详细指导如何部署和调度一个基于node.js的网页爬虫,使其能够每日自动运行并将其数据提供给前端应用。文章将区分客户端与服务器端j*ascript的运行环境,介绍本地任务调度方法,并探讨将爬虫集成到在线服务以实现数据共享的策略,同时涵盖数据持久化、cors处理及部署最佳实践。
1. 理解Node.js爬虫的运行环境
首先,我们需要明确一点:您所编写的爬虫代码(使用 puppeteer 和 fs 模块)是一个基于Node.js环境运行的服务器端脚本,而非在浏览器中执行的客户端J*aScript。
- 客户端J*aScript:在用户的浏览器中运行,主要负责页面交互、DOM操作等,无法直接访问本地文件系统或执行外部程序。
- 服务器端Node.js:在服务器或本地计算机上运行,可以执行文件I/O操作(如 fs.writeFile),启动无头浏览器(如 puppeteer),处理网络请求等。
因此,要让您的 index.js 每日自动运行,并使其生成的数据可供前端页面访问,需要采取与部署静态网站不同的策略。
以下是您提供的Node.js爬虫代码示例:
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',
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('arreglo2.json s*ed successfully')
})
await browser.close(); // 关闭浏览器实例
})();
// 爬取第二个数据源
(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('arreglo.json s*ed successfully')
})
await browser.close(); // 关闭浏览器实例
})();
// 爬取第三个数据源
(async () => {
const br
owser = 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('cotacaoFechamento.json s*ed successfully')
})
await browser.close(); // 关闭浏览器实例
})();请注意,为了避免资源泄露,在每个 puppeteer 实例使用完毕后,都应调用 await browser.close(); 关闭浏览器。
2. 本地调度方案:Windows任务计划程序
如果您希望爬虫在自己的Windows电脑上每日定时运行,最直接的方法是使用Windows任务计划程序(Task Scheduler)。
操作步骤:
- 打开任务计划程序: 在Windows搜索栏输入“任务计划程序”并打开。
- 创建基本任务: 在右侧“操作”面板中选择“创建基本任务...”。
-
任务命名与描述:
- 名称: 例如 “每日爬虫任务”。
- 描述: 简要说明任务用途。
-
配置触发器:
- 选择“每天”。
- 设置起始日期和时间,例如每日“上午 8:00:00”。
- 点击“下一步”。
-
定义操作:
- 选择“启动程序”。
- 程序或脚本: 填写您的Node.js安装路径中的 node.exe。通常在 C:\Program Files\nodejs\node.exe 或您自定义的安装路径。
- 添加参数(可选): 填写您的爬虫脚本路径,例如 C:\Users\YourUser\path\to\your\project\index.js。请确保使用完整路径。
- 起始于(可选): 填写您的爬虫脚本所在目录的路径,例如 C:\Users\YourUser\path\to\your\project\。这对于脚本中涉及相对路径的文件操作很重要。
- 点击“下一步”。
- 完成: 检查任务摘要,确认无误后点击“完成”。
现在,您的Node.js爬虫将在每天上午8点自动运行,并将数据保存到指定的JSON文件中。
3. 将爬虫数据集成到前端应用
爬虫在本地运行并生成JSON文件后,如何让您的静态HTML页面访问这些数据呢?这涉及到将数据“服务”出去。
3.1 本地开发环境的CORS问题
您提到在 C:// 目录下运行爬虫时遇到CORS错误,而在XAMPP环境下则正常。这是因为:
- 本地文件协议 (file://):当您直接在浏览器中打开HTML文件时,它使用 file:// 协议。出于安全考虑,浏览器严格限制 file:// 页面通过 XMLHttpRequest 或 fetch API 访问其他本地文件(即使是同一目录下的文件)。这被视为跨域请求,因此会触发CORS错误。
- HTTP服务器 (XAMPP):XAMPP提供了一个本地HTTP服务器。当您通过 http://localhost/your_project/index.html 访问页面时,它运行在 http:// 协议下。在这种情况下,HTML页面可以自由地请求同一域(localhost)下的其他资源(包括爬虫生成的JSON文件),因为它们不再是跨域请求。
因此,要让前端页面访问爬虫生成的数据,您需要一个HTTP服务器来提供这些JSON文件。
Avatar AI
AI成像模型,可以从你的照片中生成逼真的4K头像
92
查看详情
3.2 部署策略
a. 简单的Node.js HTTP服务器
您可以编写一个简单的Node.js服务器来提供爬虫生成的JSON文件。
-
创建 server.js 文件: 在您的项目根目录创建一个 server.js 文件。
const http = require('http'); const fs = require('fs'); const path = require('path'); const hostname = '127.0.0.1'; // 或 '0.0.0.0' 允许外部访问 const port = 3000; const dataDir = __dirname; // 假设JSON文件与server.js在同一目录 const server = http.createServer((req, res) => { // 允许跨域请求,重要! res.setHeader('Access-Control-Allow-Origin', '*'); // 生产环境请指定具体域名 res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type'); res.setHeader('Access-Control-Allow-Credentials', true); // 处理OPTIONS请求(CORS预检请求) if (req.method === 'OPTIONS') { res.writeHead(204); res.end(); return; } if (req.url === '/data/arreglo2.json') { fs.readFile(path.join(dataDir, 'arreglo2.json'), (err, data) => { if (err) { res.statusCode = 404; res.setHeader('Content-Type', 'text/plain'); res.end('File not found'); return; } res.statusCode = 200; res.setHeader('Content-Type', 'application/json'); res.end(data); }); } else if (req.url === '/data/arreglo.json') { fs.readFile(path.join(dataDir, 'arreglo.json'), (err, data) => { if (err) { res.statusCode = 404; res.setHeader('Content-Type', 'text/plain'); res.end('File not found'); return; } res.statusCode = 200; res.setHeader('Content-Type', 'application/json'); res.end(data); }); } else if (req.url === '/data/cotacaoFechamento.json') { fs.readFile(path.join(dataDir, 'cotacaoFechamento.json'), (err, data) => { if (err) { res.statusCode = 404; res.setHeader('Content-Type', 'text/plain'); res.end('File not found'); return; } res.statusCode = 200; res.setHeader('Content-Type', 'application/json'); res.end(data); }); } else { res.statusCode = 404; res.setHeader('Content-Type', 'text/plain'); res.end('Not Found'); } }); server.listen(port, hostname, () => { console.log(`Server running at http://${hostname}:${port}/`); }); 运行服务器: 在终端中运行 node server.js。
-
前端获取数据: 您的HTML页面中的J*aScript可以通过 fetch API 请求数据:
fetch('http://127.0.0.1:3000/data/arreglo2.json') .then(response => response.json()) .then(data => { console.log('Fetched arreglo2.json:', data); // 处理数据显示逻辑 }) .catch(error => console.error('Error fetching data:', error));
b. 云服务部署与调度
为了实现更稳定、可扩展的在线服务,您可以将爬虫部署到云平台。
-
Serverless 函数 (如AWS Lambda, Vercel Serverless Functions, Netlify Functions):
- 优点:按需付费,无需管理服务器,可配置定时触发器(如AWS CloudWatch Events),非常适合定时运行的短任务。
- 挑战:puppeteer 依赖无头浏览器,部署到Serverless环境需要额外配置(如使用 chrome-aws-lambda)。文件系统通常是临时的,JSON数据需要保存到持久化存储(如AWS S3、数据库)。
-
PaaS 平台 (如Heroku, Render, Railway):
- 优点:简化部署流程,支持Node.js应用,可配置定时任务(通常通过平台提供的附加组件或自定义脚本)。
- 部署:您可以将爬虫和上述的Node.js HTTP服务器一起部署为一个应用。
- 挑战:免费层级可能有限制,文件系统通常也是临时的,需考虑数据持久化。
-
虚拟机/容器 (如AWS EC2, Docker, Kubernetes):
- 优点:完全控制运行环境,可以安装所有依赖,适用于复杂或资源密集型爬虫。
- 部署:您可以在虚拟机上安装Node.js,并将爬虫和HTTP服务器部署上去。调度可以使用Linux的 cron 任务或Windows的任务计划程序。
- 挑战:管理成本较高,需要一定的DevOps知识。
数据持久化考量: 在云环境中,服务器的文件系统通常是临时的。这意味着每次应用重启或Serverless函数调用时,之前保存的JSON文件可能会丢失。为了确保数据持久性,您应该考虑将爬取到的数据存储到:
- 云存储服务:如AWS S3、Google Cloud Storage。
- 数据库:如MongoDB、PostgreSQL、MySQL。
- Redis:作为缓存或临时存储。
4. 关键注意事项与最佳实践
- 错误处理与日志:对于自动化任务,完善的错误处理和日志记录至关重要。当爬虫失败时,您需要知道原因并及时收到通知。
- 环境配置:使用环境变量来管理端口号、数据存储路径、API密钥等配置信息,避免硬编码。
- CORS策略:如果您部署了自定义的Node.js HTTP服务器,请务必正确配置 Access-Control-Allow-Origin 头,以允许您的前端域名访问数据。在生产环境中,不要使用 *,而应指定具体的前端域名。
- 资源管理:puppeteer 启动无头浏览器会消耗大量内存和CPU。确保您的服务器或云函数有足够的资源。在每次爬取任务完成后,务必调用 browser.close() 释放资源。
- 部署自动化:随着项目迭代,手动部署会变得繁琐。考虑使用CI/CD工具(如GitHub Actions, GitLab CI/CD)自动化代码测试、构建和部署过程。
- 爬虫道德与法律:在进行网页爬取时,请务必遵守目标网站的 robots.txt 协议,尊重网站的使用条款,并注意数据隐私和版权问题。避免对网站造成过大负载。
总结
部署和调度一个Node.js网页爬虫需要您理解其服务器端运行的特性。对于本地运行,Windows任务计划程序是一个简单有效的调度工具。而要将数据提供给在线前端应用,您需要一个HTTP服务器来提供这些JSON文件。根据您的需求和技术栈,可以选择部署简单的Node.js HTTP服务器,或利用云平台的Serverless函数、PaaS服务等更专业的解决方案。在任何部署中,数据持久化、错误处理和CORS配置都是不可忽视的关键点。
以上就是部署与调度Node.js爬虫:从本地执行到云端集成的详细内容,更多请关注其它相关文章!
# linux
# 关闭浏览器
# 文件系统
# 运行环境
# 您可以
# 表单
# 您的
# node.js
# js
# html
# redis
# java
# javascript
# nodejs
# mysql
# 前端
# 营销推广论文提纲
# 视频推广网站推荐什么好
# 临汾seo技术供应商
# 官渡网站建设推广地址
# 简单网站建设苏州
# 天水seo公司咨询15火星
# 固原营销网络推广
# 分行营销推广方案怎么写
# 如何推广凤凰新闻网站呢
# 浙江短视频seo布局图
# 您需要
# 是一个
# 数据存储
# 自定义
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Win11怎么开启卓越性能模式 Win11电源选项启用高性能释放硬件潜力【方法】
J*aScript实现单选按钮与关联输入框的联动禁用教程
Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南
Windows 11怎么彻底关闭定位_Windows 11服务中禁用Geolocation
今日头条怎么同步内容到抖音_今日头条内容同步到抖音教程
cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法
蛙漫安全无毒 官方认证的绿色入口
微信群消息显示延迟如何解决 微信群消息刷新优化方法
怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】
win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法
Spring Boot嵌入式服务器与J*a EE:功能支持深度解析
动漫共和国防屏蔽稳定域名-动漫共和国官方正版直达通道
QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网
极速漫画官方主页网址 极速漫画漫画在线浏览官网链接
Golang如何实现简单的Web表单_Golang表单提交与验证处理方法
Composer如何解决json扩展缺失的错误
正确连接J*aScript到HTML实现可点击图片与自定义事件处理
Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧
如何仅使用CSS更改登录界面背景图像图标的颜色
2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC
J*aScriptWebpack优化_J*aScript构建工具实战
Android Studio计算器C键功能异常排查与修复教程
自定义Bag-of-Words实现:处理带负号的词汇权重
谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作
聚水潭ERP登录页面入口 聚水潭ERP官网登录界面
如何在Promise链中优雅地中断后续then执行
J*aScript map 迭代中检测空数组元素的有效方法
mc.js游戏直达 mc.js网页免下载版本秒进地址
Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧
Go语言中Map存储的结构体如何调用指针方法:深入解析与实践
JUnit5/Mockito:优雅测试内部依赖与异常处理的实践
提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案
QQ官网正版登录链接 QQ在线登录入口最新
Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】
AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看
12306选座怎么选到商务座_12306商务座选择与配置说明
如何有效阻止外部脚本意外修改内联样式的高度属性
解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException
优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法
利用Bokeh CustomJS动态控制DataTable列可见性
Lar*el 8 多关键词数据库搜索优化实践
outlook中文官网入口地址 outlook官方中文版直达首页链接
如何在J*a中使用Locale处理多语言环境
React Router v6 教程:构建认证保护的私有路由与重定向策略
大麦的“候补”是什么意思 大麦候补购票规则【详解】
如何修改开机登录密码_Windows账户安全设置超详细教程【必学】
在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明
夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案
Golang如何实现状态模式管理对象状态_Golang State模式实现技巧
Spyder启动失败:字体文件权限拒绝错误解决方案


2025-11-22
浏览次数:次
返回列表
owser = 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('cotacaoFechamento.json s*ed successfully')
})
await browser.close(); // 关闭浏览器实例
})();