Web抓取:当使用Mikeal的node.js请求模块时,接近15%的部分下载结束

时间:2013-01-09 14:42:35

标签: node.js web-scraping

我正在使用Mikeal的request库为node.js抓取灵感库并将图像下载到磁盘。问题是,大部分在下载会话开始时的一堆图像部分或者不是全部下载。这显示在下图中(按Date Modified排序的文件夹)。在前17张图像之后,其余的下载正常,从第3行第4列开始可以看到。

Partial downloads

这是我正在使用的node.js / request代码的相关部分:

// images is an array of URLs to .jpg images
for( var i = 0, len = images.length ; i < len ; i++ ) {
    request.get( images[i] ).pipe( fs.createWriteStream(destinationFilename) )
}

我正在使用request从存储在images数组中的网址中获取图像数据,并将其传输到将其写入磁盘的stream。大部分时间这种方法都可以正常工作,但下载量的1%到15%最终会被部分下载。

我尝试使用drain对象的stream事件获取bytesWritten并将其与bytesTotal进行比较,但这种做法并没有让我感到随意。还有其他方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

使用async。您必须使用async.queue并发送具有有限并行性的请求。您的代码正在尝试同时生成images.length个请求数。 Node.js是非I / O阻塞。所以你需要控制你产生的事件数量。异步是你需要的包装。

答案 1 :(得分:1)

如果没有看到整个脚本,我猜你的进程在所有请求完成之前就已经终止了。您可以尝试使用异步库,如前所述,但您可以通过event emitter solution充分利用异步请求来更快地完成此任务。

希望这有帮助!