在使用Node.js、request-promises和cheerio进行多级抓取时,可以使用Promise.all()方法来确保文件写入函数等到所有请求都完成。
首先,我们需要使用request-promises库来发送HTTP请求并获取响应数据。然后,使用cheerio库来解析HTML响应数据,提取所需的信息。
以下是一个示例代码,演示了如何使用Promise.all()来确保文件写入函数在所有请求完成后执行:
const rp = require('request-promise');
const cheerio = require('cheerio');
const fs = require('fs');
// 定义要抓取的URL列表
const urls = ['http://example.com/page1', 'http://example.com/page2', 'http://example.com/page3'];
// 定义文件写入函数
function writeFile(data) {
return new Promise((resolve, reject) => {
fs.writeFile('output.txt', data, 'utf8', (err) => {
if (err) {
reject(err);
} else {
resolve();
}
});
});
}
// 发送并处理所有请求
Promise.all(urls.map(url => rp(url)))
.then(responses => {
// 解析HTML响应数据
const extractedData = responses.map(html => {
const $ = cheerio.load(html);
// 提取所需的信息
// ...
return extractedInfo;
});
const outputData = JSON.stringify(extractedData);
// 写入文件
return writeFile(outputData);
})
.then(() => {
console.log('文件写入完成!');
})
.catch(err => {
console.error('发生错误:', err);
});
在上述示例代码中,首先定义了要抓取的URL列表。然后,定义了一个文件写入函数writeFile(),该函数返回一个Promise对象,当文件写入完成时resolve(),否则reject()。
接下来,使用Promise.all()方法将所有请求的Promise对象组合成一个新的Promise对象。Promise.all()接受一个数组,其中包含多个Promise对象。它返回一个新的Promise对象,该对象在所有输入的Promise对象都完成时才会完成,并将所有Promise对象的结果以数组的形式传递给后续的.then()处理。
在Promise.all()的.then()处理中,我们首先使用cheerio库解析HTML响应数据,并提取所需的信息。然后,将提取的数据转换为字符串,并调用writeFile()函数将其写入文件。最后,使用另一个.then()处理来输出完成消息,或使用.catch()捕获任何错误。
请注意,这只是一个示例代码,你需要根据实际情况进行适当的修改和调整。
希望这能帮助到你!如果需要更多帮助,请随时提问。
领取专属 10元无门槛券
手把手带您无忧上云