为什么用http.request获取的网页源码,写入本地的文件的时候不是整个网页
发布于 13 年前 作者 sirzxj 6370 次预览 最后一次回复是 13 年前 来自
var req = http.request({ host: ‘www.qq.com’, method: ‘get’ }, function(res) { res.setEncoding(‘utf8’); res.on(‘data’, function(data) { fs.writeFile(‘test.html’, data); }); }); req.end();
如题,上面的test.html文件打开后,不是www.qq.com那个网页的全部源码,只有部分,请问如何解决?
6 回复
页面太长,所以会分成几个部分,分别触发data事件。你这样写的结果就是只保存了最后的一个部分。应当先在内存中缓冲,最后一次性写入文件
不知道
fs.appendFile成不成, 更好还是按楼上说的用buffer… http://nodejs.org/docs/latest/api/fs.html#fs_fs_appendfile_filename_data_encoding_utf8_callback接收完数据后会触发end事件: 正确写法如下: var req = http.request({ host: ‘www.qq.com’, method: ‘get’ }, function(res) { res.setEncoding(‘utf8’); var html = []; res.on(‘data’, function(data) { html.push(data); }); res.on(‘end’,function(){ fs.writeFile(‘test.html’, html.join("")); }); }); req.end();
要说答案3楼的是最佳的,我在这里再说具体点 问题的关键是楼主用了fs.writeFile方法,请看它的源码: 来自lib/fs.js
可以看到它使用fs.open方法,使用使用了w模式,而这个模式表示,如果文件不存在则创建或者清空它。于是在Buffer写完64K之后就清空了一遍test.html。要知道QQ的首页少说得有300来K。于是就成这结果了。
res.on(‘end’)