
本教程详细阐述如何部署和自动化运行node.js网络爬虫,实现定时数据抓取并更新静态网站内容。我们将探讨node.js脚本的服务器端运行机制、windows任务计划程序等调度工具的配置,以及爬取数据与静态html页面集成的策略,旨在帮助您构建高效且自动化的数据更新流程。
首先,明确您的Node.js爬虫脚本(如index.js)是一个服务器端应用程序,它需要一个Node.js运行时环境才能执行。这与您部署静态HTML、CSS和客户端JavaScript文件的Web服务器环境有所不同。静态网站文件由浏览器直接加载和渲染,而Node.js脚本则在服务器上独立运行,执行文件操作、网络请求等任务。
这意味着您的index.js文件不能像普通的客户端JavaScript那样直接通过 <script> 标签在浏览器中运行。它需要一个安装了Node.js的操作系统(如Windows、Linux、macOS或云服务器)来启动。
部署Node.js爬虫脚本的第一步是将其放置在一个可以访问Node.js运行时的机器上。
在本地进行开发和测试时,您可能会遇到跨域资源共享(CORS)问题,尤其当您尝试从本地文件系统加载JSON数据时。这是因为浏览器出于安全考虑,限制了本地文件对其他资源的访问。
用户提到的使用XAMPP解决了问题,这是因为XAMPP提供了一个本地Web服务器(Apache),当您将HTML和JSON文件都放在XAMPP的Web根目录(如htdocs)下时,它们通过localhost从同一个“源”(origin)提供服务。这样,您的HTML页面就可以通过相对路径或http://localhost/...来访问由爬虫生成的JSON文件,从而规避了CORS限制。
对于生产环境,您通常会将爬虫部署到以下类型的服务器:
为了让爬虫每天定时运行,您需要利用操作系统的任务调度功能。
对于Windows服务器,可以使用“任务计划程序”来自动化执行Node.js脚本。
步骤:
对于Linux或macOS服务器,可以使用cron服务来调度任务。
打开Crontab编辑器: 在终端输入 crontab -e。
添加任务行: 在文件末尾添加一行,指定运行时间和命令。例如,每天上午8点运行:
0 8 * * * /usr/bin/node /path/to/your/index.js >> /path/to/your/cron.log 2>&1
保存并退出: 保存文件后,cron会自动加载新的任务。
对于更复杂的云原生应用,可以考虑使用云服务提供的调度功能:
这是将爬虫结果展示到静态网站的关键环节。由于静态网站本身无法执行服务器端逻辑,需要特定的策略来获取更新的数据。
如果您的静态网站和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服务器。
如果您的静态网站托管在不同的平台(如GitHub Pages、Netlify、Vercel),而爬虫运行在独立的服务器上,则需要一个中间层。
对于需要频繁更新内容且注重性能和SEO的静态网站,可以结合静态网站生成器(如Jekyll、Hugo、Next.js的静态导出)和持续集成/持续部署(CI/CD)流程。
以下是您提供的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(); // 确保关闭浏览器实例
})();代码说明:
以上就是Node.js爬虫的部署、调度与静态网站数据集成指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号