【发布时间】:2016-02-28 21:55:36
【问题描述】:
我正在尝试制作一个网络爬虫,它可以爬取 IMDB 并列出电影名称和评级。这是我的 index.js 文件。 假设我正在为 10 部电影爬行。然后,我将抓取的结果保存在另一个文件中,例如“message.txt”。现在我想发送这个 message.txt 文件作为对任何请求的响应。但是每当我提出请求时,它总是首先向我的浏览器发送一个空文件。然后我注意到爬取的结果保存在 message.txt 文件中需要一些时间。我认为这是因为 nodejs 中的所有操作都是异步的。那么有没有办法在爬取完成后才发送message.txt文件呢?
var express = require('express');
var app = express();
var cheerio = require('cheerio');
var request = require('request');
var fs = require('fs');
app.listen(8080);
console.log('Running');
app.get('/', function(req, res) {
console.log('Recieved the get Request');
var i = 1;
var count = 0;
while (count < 10) {
var url = 'http://www.imdb.com/title/tt' + i + '/';
console.log(url);
count = count + 1;
i = i + 1;
request(url, function(error, response, html) {
if (!error) {
var $ = cheerio.load(html);
var title, ratings, released;
var json = {
title: '',
ratings: '',
released: ''
};
$('.title_wrapper').filter(function() {
var data = $(this);
json.title = data.children().first().text().trim();
json.released = data.children().last().children().last().text().trim();
});
$('.ratingValue').filter(function() {
var data = $(this);
json.ratings = parseFloat(data.text().trim());
});
console.log(json);
fs.appendFile('message.txt', JSON.stringify(json, null, 4) + '\n', function(err) {});
};
});
};
res.sendFile(__dirname + '/index.js');
});
【问题讨论】:
-
使用 promises - 回调,当 fs 流完成保存文件时调用发送文件。
-
你能否解释更多@GandalftheWhite
标签: node.js asynchronous web-crawler imdb