Nodejs / Puppeteer - время ожидания навигации - PullRequest
0 голосов
/ 27 августа 2018

Мне нужна помощь, чтобы понять, как работает тайм-аут, особенно с узлом / кукловодом

Я прочитал все вопросы о стеке и 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 голосов
/ 27 августа 2018

Я рекомендую вам не использовать метод waitForNavigation до вызова goTo.

В принципе, было бы лучше использовать метод gotTo со значением по умолчанию, то есть 30000. На мой взгляд, если веб-сайт работает или реагирует более 30 секунд, что-то не так.

Вместо этого я бы сделал что-то вроде этого:

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

В зависимости от версии кукловода, которую вы используете, у вас будет другое поведение. Я использую версию 1.4.0, и она пока работает хорошо.

Внутри документации говорится следующее:

page.goto выдаст ошибку, если:

  • есть ошибка SSL (например, в случае самозаверяющих сертификатов).
  • целевой URL недействителен.
  • превышен тайм-аут во время навигации.
  • не удалось загрузить основной ресурс.

Итак, убедитесь, что ни один из предыдущих сценариев не происходит.

Кроме того, вы можете свернуть URL-адрес со своего терминала, чтобы увидеть, реагирует ли URL-адрес на внешние вызовы, также распространены проблемы перекрестного происхождения.

С уважением, нет никакого способа сказать, что может вызвать ваш тайм-аут, но этот контрольный список должен помочь. Недавно у меня была проблема с тайм-аутом, и проблема была в конфигурации моего сервера, поэтому я предлагаю вам также проверить, имеет ли машина, на которой вы запускаете этот код, необходимую память для выполнения.

0 голосов
/ 27 августа 2018

В вашем цикле,

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","")

По умолчанию будет "", если такого значения нет.

Кроме того, следующее прекрасно работает с вашим кодом в 1.7 через https://try -puppeteer.appspot.com /

await page.goto(url, {
    waitUntil: 'networkidle2',
    timeout: '5000'
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...