
本教程详细指导如何部署和调度一个基于node.js的网页爬虫,使其能够每日自动运行并将其数据提供给前端应用。文章将区分客户端与服务器端javascript的运行环境,介绍本地任务调度方法,并探讨将爬虫集成到在线服务以实现数据共享的策略,同时涵盖数据持久化、cors处理及部署最佳实践。
首先,我们需要明确一点:您所编写的爬虫代码(使用 puppeteer 和 fs 模块)是一个基于Node.js环境运行的服务器端脚本,而非在浏览器中执行的客户端JavaScript。
因此,要让您的 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 saved 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 saved successfully')
})
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('cotacaoFechamento.json saved successfully')
})
await browser.close(); // 关闭浏览器实例
})();请注意,为了避免资源泄露,在每个 puppeteer 实例使用完毕后,都应调用 await browser.close(); 关闭浏览器。
如果您希望爬虫在自己的Windows电脑上每日定时运行,最直接的方法是使用Windows任务计划程序(Task Scheduler)。
操作步骤:
现在,您的Node.js爬虫将在每天上午8点自动运行,并将数据保存到指定的JSON文件中。
爬虫在本地运行并生成JSON文件后,如何让您的静态HTML页面访问这些数据呢?这涉及到将数据“服务”出去。
您提到在 C:// 目录下运行爬虫时遇到CORS错误,而在XAMPP环境下则正常。这是因为:
因此,要让前端页面访问爬虫生成的数据,您需要一个HTTP服务器来提供这些JSON文件。
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页面中的JavaScript可以通过 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函数调用时,之前保存的JSON文件可能会丢失。为了确保数据持久性,您应该考虑将爬取到的数据存储到:
部署和调度一个Node.js网页爬虫需要您理解其服务器端运行的特性。对于本地运行,Windows任务计划程序是一个简单有效的调度工具。而要将数据提供给在线前端应用,您需要一个HTTP服务器来提供这些JSON文件。根据您的需求和技术栈,可以选择部署简单的Node.js HTTP服务器,或利用云平台的Serverless函数、PaaS服务等更专业的解决方案。在任何部署中,数据持久化、错误处理和CORS配置都是不可忽视的关键点。
以上就是部署与调度Node.js爬虫:从本地执行到云端集成的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号