Nodejs / Puppeteer-导航超时

时间:2018-08-27 12:58:13

标签: node.js puppeteer

我需要帮助来了解超时的工作原理,尤其是对于节点/操纵符

我阅读了所有与此有关的堆栈问题和github问题,但我可以弄清楚出了什么问题

可能是我的代码...

运行此文件时,我收到来自图像的错误。您可以看到我尝试修复它的方法,但没有任何效果

有人可以解释为什么会发生这种情况以及避免这种情况的最佳方法吗?有没有更好的方法来获得这些项目?

//vou até os seeds em x tempo
var https = require('https');
var Q = require('q');
var fs = require('fs');
var puppeteer = require('puppeteer');
var Projeto = require('./Projeto.js');

const url = 'https://www.99freelas.com.br/projects?categoria=web-e-desenvolvimento'
/*const idToScrape;
deverá receber qual a url e os parametros específicos de cada seed */
async function genScraper() {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();

    //page.setDefaultNavigationTimeout(60000);
    page.waitForNavigation( { timeout: 60000, waitUntil: 'domcontentloaded' });

    await page.goto(url);


    var projetos = await page.evaluate(() => {
        let qtProjs = document.querySelectorAll('.result-list li').length;

        let listaDeProjs = Array.from(document.querySelectorAll('.result-list li'));

        let tempProjetos = [];

        for( var i=0; i<=listaDeProjs.length; i++ ) {
            let titulo = listaDeProjs[i].children[1].children[0].textContent;
            let descricao = listaDeProjs[i].children[2].textContent;
            let habilidades = listaDeProjs[i].children[3].textContent;
            let publicado = listaDeProjs[i].children[1].children[1].children[0].textContent;
            let tempoRestante = listaDeProjs[i].children[1].children[1].children[1].textContent;
            //let infoCliente;
            proj = new Projeto(titulo, descricao, habilidades, publicado, tempoRestante);
            tempProjetos.push(proj);
        }

        return tempProjetos;
    });

    console.log(projetos);
    browser.close();
}

genScraper();

enter image description here

2 个答案:

答案 0 :(得分:1)

在您的for循环中,

for( var i=0; i<=listaDeProjs; i++ ) {
   ...
}

listaDeProjs应该是listaDeProjs.length

如果未定义此路径中的任何地方,您的评估脚本将在多个地方失败:(例如,如果children[1]未定义或children[0]未定义。)

listaDeProjs[i].children[1].children[0].textContent;

您可以使用lodash执行以下操作:

_.get(listaDeProjs[i],"children[1].children[0].textContent","")

如果没有该值,则默认为""

此外,以下代码可以通过https://try-puppeteer.appspot.com/

与1.7中的代码完美配合
await page.goto(url, {
    waitUntil: 'networkidle2',
    timeout: '5000'
});

答案 1 :(得分:1)

我建议您避免在waitForNavigation调用之前使用方法goTo

基本上,最好将方法gotTo与默认值30000一起使用。我认为,如果网站花费超过30秒的时间才能正常工作或做出响应,则应该有问题。

相反,我会做这样的事情:

await page.goto(url, {
  waitUntil: 'networkidle0'
});

根据您使用的操纵up的版本,您会有不同的行为。我正在使用1.4.0版本,到目前为止效果很好。

文档中的内容如下:

  

在以下情况下,page.goto将引发错误:

     
      
  • 存在SSL错误(例如,在自签名证书的情况下)。
  •   
  • 目标URL无效。
  •   
  • 导航期间超过了超时。
  •   
  • 主要资源加载失败。
  •   

因此,请检查是否没有上述情况发生。

此外,您可以从终端卷曲URL,以查看URL是否响应外部呼叫,跨源问题也很常见。

真诚地,没有办法说出什么可以触发您的超时,但是该清单应该会有所帮助。我最近遇到超时问题,问题出在我的服务器配置上,所以建议您还查看运行此代码的计算机是否具有执行所需的内存。