节点js中的媒体蜘蛛

时间:2013-07-20 16:33:29

标签: node.js web-crawler

我正在研究GitHub上名为机器人托管的项目。我的项目的工作是从xml配置文件中提供的url中获取媒体。并且xml配置文件具有已定义的格式,就像在脚本目录中看到的那样。

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

  1. 指示网络链接有多深的列表,并且根据列表项中的选择器(css​​选择器),我可以找到媒体网址或子页面网址,在那里我可以最终找到媒体。
  2. 包含子页面网址的arr。
  3. 简化示例如下:

    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不是执行此类工作的正确方法吗?

1 个答案:

答案 0 :(得分:1)

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

基本上你会这样做:

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

这样你就可以让for-loop像现在一样添加所有的URL,但是一次只处理一个URL,所以不会使用太多的资源。