Javascript 使用Cheerio删除多个站点

Javascript 使用Cheerio删除多个站点,javascript,node.js,cheerio,Javascript,Node.js,Cheerio,我正在使用cheerio搜索大约800个网站,以获取网站标题。我遇到的第一个问题是,有时我会收到一条错误消息,说“我们遇到了一个错误:错误:套接字挂起”。其次,可能是由于cheerio的异步特性,当我记录创建的对象时,它们都具有数组中最后一个web地址的地址。最后,我记录了我一直将对象推入的数组,但实际上它会立即将其记录为[],因为它会在执行任何其他操作之前完成此操作。如何解决这三个问题?我一直在 var tempArr = []; var completedLinks = ["http://w

我正在使用
cheerio
搜索大约800个网站,以获取网站标题。我遇到的第一个问题是,有时我会收到一条错误消息,说“我们遇到了一个错误:错误:套接字挂起”。其次,可能是由于cheerio的异步特性,当我记录创建的对象时,它们都具有数组中最后一个web地址的地址。最后,我记录了我一直将对象推入的数组,但实际上它会立即将其记录为
[]
,因为它会在执行任何其他操作之前完成此操作。如何解决这三个问题?我一直在

var tempArr = [];
var completedLinks = ["http://www.example.com/page1", "http://www.example.com/page2", "http://www.example.com/page3"...];

for (var foundLink in completedLinks){

  if(ValidURL(completedLinks[foundLink])){

    request(completedLinks[foundLink], function (error, response, body) {

      if (!error) {
        var $ = cheerio.load(body);
        var titles = $("title").text();

        var tempObj = {};
        tempObj.title = titles;
        tempObj.address = completedLinks[foundLink]

        tempArr.push(tempObj);

        console.log(tempObj)
      }else{
        console.log("We’ve encountered an error: " + error);
      }    

    });

  }
}
console.log(tempArr);

您的挂断可能是因为许多站点实施了速率限制。我猜这些错误往往发生在网站的第2页上。您可能需要做的一件事是按主机将链接组织到列表中,并在第一次访问该主机后使用setTimeout来限制每次调用

您的“最后一个网址”问题是一个关于范围的经典JavaScript问题。至少,您应该在如下函数中处理每个请求:

function processLink(link){
 if(ValidURL(link)...
}
然后

最后WRT等待,直到退出之前,所有都应该考虑

忽略节流问题:

function processLink(link){
  return new Promise(function(resolve, reject) {
    request(link, function (error, response, body) {
        if (!error) {
          resolve(tempObj);
        }

    });
  });
};

var promises = [];
for (var foundLink in completedLinks){ 
  promises.push(processLink(completedLinks[foundLink]));
}
Promise.all(promises).then(function(tempObjArr){...});

您的挂断可能是因为许多站点实施了速率限制。我猜这些错误往往发生在网站的第2页上。您可能需要做的一件事是按主机将链接组织到列表中,并在第一次访问该主机后使用setTimeout来限制每次调用

您的“最后一个网址”问题是一个关于范围的经典JavaScript问题。至少,您应该在如下函数中处理每个请求:

function processLink(link){
 if(ValidURL(link)...
}
然后

最后WRT等待,直到退出之前,所有都应该考虑

忽略节流问题:

function processLink(link){
  return new Promise(function(resolve, reject) {
    request(link, function (error, response, body) {
        if (!error) {
          resolve(tempObj);
        }

    });
  });
};

var promises = [];
for (var foundLink in completedLinks){ 
  promises.push(processLink(completedLinks[foundLink]));
}
Promise.all(promises).then(function(tempObjArr){...});