首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nodejs批处理下载脚本:在JSONStream "on“事件中发出HTTP请求

Nodejs批处理下载脚本:在JSONStream "on“事件中发出HTTP请求
EN

Stack Overflow用户
提问于 2013-09-13 11:45:13
回答 1查看 1.3K关注 0票数 0

我有个奇怪的问题。如果我调用此代码在主执行行中发出http请求:

代码语言:javascript
复制
var request = require('request');
request('http://www.google.com', function (error, response, body) {
    if (!error && response.statusCode == 200) {
        console.log(body) // Print the google web page.
    }
})

正如预期的那样,Google页面HTML是打印出来的。

但是,我正在进行批量下载脚本/爬虫,所以我解析一个非常大的JSON文件,然后为我从该文件生成的每个URL执行一个请求。

为了进行解析,我使用JSONStream解析器。以下是代码:

代码语言:javascript
复制
parser.on('data', function (obj) {
    console.log("Found uri");
    console.log(obj);
});

代码正在正确运行,因为URI正在我的控制台中打印。

但是,如果我在解析块中发出请求,则请求回调永远不会执行.以下是代码:

代码语言:javascript
复制
parser.on('data', function (obj) {

    console.log("Found uri");
    console.log(obj);

    var identifierArray = obj['dc.identifier'];

    if(identifierArray != null && identifierArray instanceof Array)
    {
        for(var i = 0; i < identifierArray.length; i++)
        {
            var dryadIdentifier = identifierArray[i];
            if(dryadIdentifier.indexOf("dryad") != -1)
            {
                var fullUrl = "http://datadryad.org/resource/"+dryadIdentifier+"/mets.xml"
                //var fileDestination = __dirname +"/"+downloadSubDir+"/"+dryadIdentifier.replace("/","_")+".xml"
                var fileDestination = __dirname +"/"+downloadSubDir+"/"+fileCounter+".xml";

                fileCounter++;

                console.log("Sending request to "+ fullUrl + "   ...");

               //REQUEST SENT HERE; SAME CODE AS ABOVE.

                var request = require('request');
                request('http://www.google.com', function (error, response, body) {
                    if (!error && response.statusCode == 200) {
                        console.log(body) // Print the google web page.
                    }
                })

                sleep.usleep(500000); //dont hammer the server
            }
        }
    }
});

日志显示

代码语言:javascript
复制
Sending request to http://datadryad.org/resource/doi:10.5061/dryad.s737f/mets.xml   ...
Sending request to http://datadryad.org/resource/doi:10.5061/dryad.s737f/1/mets.xml   ...
Sending request to http://datadryad.org/resource/doi:10.5061/dryad.1fd83/mets.xml   ...
Sending request to http://datadryad.org/resource/doi:10.5061/dryad.1fd83/1/mets.xml   ...
Sending request to http://datadryad.org/resource/doi:10.5061/dryad.4vk6d/mets.xml   ...
Sending request to http://datadryad.org/resource/doi:10.5061/dryad.c3k8m/mets.xml   ...
Sending request to http://datadryad.org/resource/doi:10.5061/dryad.5410v/mets.xml   ...
Sending request to http://datadryad.org/resource/doi:10.5061/dryad.492r0/mets.xml   ...
Sending request to http://datadryad.org/resource/doi:10.5061/dryad.m6g1b/mets.xml   ...
Sending request to http://datadryad.org/resource/doi:10.5061/dryad.m6g1b/1/mets.xml   ...
Sending request to http://datadryad.org/resource/doi:10.5061/dryad.4dm30/mets.xml   ...

但是没有html被打印出来(它应该多次打印google主页,因为我还没有使用json解析的url来排除预期服务器的问题。

很抱歉写了这么长的信,但我对这种行为感到困惑(还在学习nodejs.-o)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-16 14:59:35

这个问题似乎与“睡眠”调用有关,所以我用信号量库实现了一个基本连接队列。我现在指定最多10个同时连接,下面是我的代码:

代码语言:javascript
复制
var makeRequestAndSaveToFile = function(url, absolutePath)
{
    sem.take(function(){
        console.log("Sending request to "+ url + "   ... and saving to file "+absolutePath);
        request(url, function(error,response, body) {
            if (!error && response.statusCode == 200) {
                fs.writeFile(absolutePath, body, function(err) {
                    sem.leave();

                    if(err) {
                        console.log(err);
                    } else {
                        console.log("The file was saved!");
                    }
                });
            }
        });
    });
}

我为我想下载的每个链接调用这个函数。

请注意,这不会处理大的下载,因为没有管道,链接将以无序的方式下载,就像斯拉沃在他的评论中说的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18785520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档