【问题标题】:a media spider in node jsnode js 中的媒体蜘蛛
【发布时间】:2013-07-20 16:33:28
【问题描述】:

我正在处理一个名为GitHub 的机器人托管项目。我的项目的工作是从 xml 配置文件给出的 url 中获取媒体。xml 配置文件具有定义的格式,就像您在脚本目录中看到的那样。

我的问题如下。有两个参数:

  1. 一个表示网络链接深度的列表,根据列表项中的选择器(css​​选择器),我可以找到最终可能找到媒体的媒体url或子页面url。
  2. 包含子页面 url 的 arr。

简化示例如下:

node_list = {..., next = {...,  next= null}};
url_arr = [urls];

我想迭代url arr中的所有项目,所以我这样做:

function fetch(url, node) {
    if(node == null) 
        return ;
    // here do something with http request
    var req = http.get('www.google.com', function(res){
        var data = '';
        res.on('data', function(chunk) {
            data += chunk;
        }.on('end', function() {
             // maybe here generate more new urls
             // get another url_list
             node = node.next;
             fetch(url_new, node);
        }
}

// here need to be run in sync
for (url in url_arr) {
     fetch(url, node)
}

如你所见,如果使用异步 http 请求,它必须吃掉所有的系统资源。我无法控制这个过程。 那么有没有人有一个好主意来解决这个问题? 或者,nodejs 不是做这些工作的正确方法吗?

【问题讨论】:

    标签: node.js web-crawler


    【解决方案1】:

    如果问题是您同时收到太多 HTTP 请求,您可以更改 fetch 函数以对一堆 URL 进行操作。

    基本上你会这样做:

    • 在调用fetch 时,将URL 插入堆栈并检查请求是否正在进行中:
    • 如果请求未运行,则从堆栈中选择第一个 url 并处理它,否则什么也不做
    • 当一个 http 请求完成后,让它从堆栈中获取一个新的 url 并处理它

    这样您就可以像现在一样让 for 循环添加所有 URL,但一次只处理一个 URL,因此不会使用太多资源。

    【讨论】:

    • 我发现一个名为node_curl的项目优雅地解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2023-01-03
    相关资源
    最近更新 更多