【问题标题】:Problems with PuppeterPuppeteer 的问题
【发布时间】:2021-04-21 11:59:51
【问题描述】:

您好,我是编程新手,我一直在使用 libery pupperter。我的问题是我无法从同一个选择器中获取所有信息。该网站是http://eportal.miteco.gob.es/BoleHWeb/,我需要获取Embases Guadarquivir 的信息。如果我在网站控制台上执行此操作,我会从选择器中获取所有信息,但如果我在 .js 中执行此操作,我只能从同一个数组中获取 30 到 40 个元素。

Information i want

The information i get from the console

const puppeter = require('puppeteer');
let embalse = require('../controlador/controladorEmbalse');

    
(async () => {
    //inicializamos en la constante browser, la libreria puppeter.
        //Con {headless: false}, nos sale una ventana chrome con los movimientos que estamos realizando.
        const browser = await puppeter.launch({headless: false});
        //creamos una pagina de chrome
        const page = await browser.newPage();

        
        let year = ['2020','2019','2018','2017','2016','2015','2014','2013','2012','2011','2010','2008','2007','2006','2005'];
        let month = ["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"];
        let day = '#idDate27'
        let cuenca = [{nombre: 'Tinto, Odiel y Piedras', id:"#btnMod_Reserva_Hidraulica_Datos_16" }, {nombre: 'Guadalete-Barbate', id: '#btnMod_Reserva_Hidraulica_Datos_15'},
        {nombre: 'Guadalquivir', id: '#btnMod_Reserva_Hidraulica_Datos_5'}, {nombre: 'Cuenca Mediterránea Andaluza', id: "#btnMod_Reserva_Hidraulica_Datos_6"}]
        
        
              //Solo utilizar este metodo si la tabla watershed esta vacia.
           //  embalse.añadirCuencas(cuenca);

        
     for(let anho of year){
          for(let mes of month){
            for(let agua of cuenca){
              await page.goto('http://eportal.miteco.gob.es/BoleHWeb/');
              await page.type('#year' , anho );
              await page.type('#month', mes);
              await page.click( day);
    
            await page.waitForSelector('#btnMnuReserva');
            await page.click('#btnMnuReserva');
    
            await page.waitForSelector(agua.id);
            await page.click(agua.id);
    
           
            await page.waitForSelector('td.tdfondosinbordes');
           const elements = await  page.evaluate(()=> {
                 let textos = [];
                
                const td = document.querySelectorAll("td.tdfondosinbordes");
               for ( let texto of td){
                  textos.push(texto.innerText);
                }
                return textos;
               
            });
            await page.waitForSelector('td.tdblancosinbordesletraazul');
           const elem = await  page.evaluate(()=> {
                 let textos = [];
                
                const td = document.querySelectorAll("td.tdblancosinbordesletraazul");
               for ( let texto of td){
                  textos.push(texto.innerText);
                }
                return textos;
               
            });
            const indicador = elements.findIndex(element => element == 'Guadiato' )
            if(indicador !== -1){
              elements.splice(indicador + 1,0,'Cala');
            }
            let nombreEmbalse =[];
           // console.log(elements);
            function filtrarNombres(nombres, array){
              const arrayFiltrado = array.filter(numero => isNaN(numero));
              for(let i = 0 ; i < arrayFiltrado.length ; i++){
                if(i % 2 == 0){
                  nombres.push(arrayFiltrado[i]);
                }
              }
                return nombres;
           }
             
            
         
           //console.log(filtrarNombres(nombreEmbalse, elements));
           const nombre = filtrarNombres(nombreEmbalse, elements);
           const datos = elem.slice(0, nombre.length)
    
           //console.log(datos);
    
           function realizarObjeto(nom, dat) {
             let infoTotal = [];
            
            let posicion = 0;
             for(let i = 0 ; i < dat.length; i++){
                let historico = {}
               
                historico.nombre = nom[i];
                historico.data = dat[posicion].trim();
                historico.fecha = anho;
                historico.mes = mes;
                historico.cuenca = agua.nombre;
                posicion++;
                infoTotal.push(historico)
               
             }
             return infoTotal;
           }
          console.log(realizarObjeto(nombre, datos));
          //let objeto = realizarObjeto(nombre, datos);
          //embalse.añadirHistorico(objeto);
            }
            
          }
          
        }
        

        await page.screenshot({path: 'amanzon1.jpg'}); 
        
    
        //cerramos el programa
        await browser.close();
})();
    

----------------------------------- --------------------------

 await page.waitForSelector('td.tdfondosinbordes');
       const elements = await  page.evaluate(()=> {
             let textos = [];
            
            const td = document.querySelectorAll("td.tdfondosinbordes");
           for ( let texto of td){
              textos.push(texto.innerText);
            }
            return textos;
           
        });

这是用于从图像中获取信息的函数。 在网站的控制台上,我得到了所有信息。但是,当我每次运行代码时都在.Js 中执行此操作时,我只能获得一半的信息,而且它永远不会相同,它会有所不同。 我试过 Page.$$eval 和其他方法,但我从来没有得到所有的信息。

【问题讨论】:

    标签: javascript node.js puppeteer


    【解决方案1】:

    如果没有人不知道原因。最大的问题是网络有一个反报废过程。使用 waitFor (它们已过时)。看来这个暂停并没有激活这个进程。

    【讨论】:

      猜你喜欢
      • 2019-11-16
      • 1970-01-01
      • 2022-08-20
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多