Necesito la ayuda de alguien porque no entiendo lo que está pasando. Básicamente, construí un script que abre un sitio web y extrae texto de los td en una tabla que tiene el sitio web. Después de extraer, hará clic en el siguiente botón y volverá a extraer el texto ya que cambió. Cuando los extrae con éxito, debe cerrar el navegador y lo hace, pero no sé por qué después de cerrarlo arroja esto
C:\Users\ribei\node_modules\puppeteer\lib\cjs\puppeteer\common\Connection.js:214 return Promise.reject(new Error(
Protocol error (${method}): Session closed. Most likely the ${this._targetType} has been closed.)); ^
Error: error de protocolo (Runtime.callFunctionOn): sesión cerrada. Lo más probable es que la página haya sido cerrada. en CDPSession.send (C:\Users\ribei\node_modules\puppeteer\lib\cjs\puppeteer\common\Connection.js:214:35) en ExecutionContext._evaluateInternal (C:\Users\ribei\node_modules\puppeteer\lib\ cjs\puppeteer\common\ExecutionContext.js:204:50) en ExecutionContext.evaluateHandle (C:\Users\ribei\node_modules\puppeteer\lib\cjs\puppeteer\common\ExecutionContext.js:155:21) en WaitTask.rerun (C:\Usuarios\ribei\node_modules\puppeteer\lib\cjs\puppeteer\common\DOMWorld.js:540:37)
Mi código
const puppeteer = require('puppeteer'); var k = 0; var i = 0; (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://www.pinksale.finance/#/launchpad/0xaD3cbb319c915104418c6fAd590EaB94C1940Ec1?chain=BSC'); const element = await page.waitForSelector('li.ant-pagination-item:nth-child(8) > a:nth-child(1)'); const value = await element.evaluate(el => el.textContent); const carteiras = await page.waitForSelector('table.has-text-centered > thead:nth-child(1) > tr:nth-child(1) > th:nth-child(2)'); const numerodecarteiras = await carteiras.evaluate(el => el.textContent); var matches = numerodecarteiras.match(/(\d+)/)[0]; for(i = 0; i<=value;i++) { for(let j = 1; j<=10;j++) { var a = 'table.has-text-centered > tbody:nth-child(2) > tr:nth-child('; var b = ') > td:nth-child(2) > div:nth-child(1)'; const element = await page.waitForSelector(a+j+b); const valor2 = await element.evaluate(el => el.textContent); console.log(valor2); k++ if(k == Number(matches)) { console.log('Número de wallets extraídas --->',k); await page.close(); await browser.close(); } } j = 1; await page.click('.ant-pagination-next > button:nth-child(1)'); } })();La sesión se está cerrando porque tiene estas dos líneas dentro de su instrucción if:
await page.close(); await browser.close(); Por lo tanto, puede moverlos debajo del bucle for como se muestra a continuación y el error desaparecerá. Y también elimine esta línea: j = 1; No entendí el uso de esta línea y aparentemente también es parte del error.
async () => { var k = 0; var i = 0; const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://www.pinksale.finance/#/launchpad/0xaD3cbb319c915104418c6fAd590EaB94C1940Ec1?chain=BSC'); const element = await page.waitForSelector('li.ant-pagination-item:nth-child(8) > a:nth-child(1)'); const value = await element.evaluate(el => el.textContent); const carteiras = await page.waitForSelector('table.has-text-centered > thead:nth-child(1) > tr:nth-child(1) > th:nth-child(2)'); const numerodecarteiras = await carteiras.evaluate(el => el.textContent); var matches = numerodecarteiras.match(/(\d+)/)[0]; for (var i = 0; i <= value; i++) { for (let j = 1; j<=10; j++) { var a = 'table.has-text-centered > tbody:nth-child(2) > tr:nth-child('; var b = ') > td:nth-child(2) > div:nth-child(1)'; const element = await page.waitForSelector(a+j+b); const valor2 = await element.evaluate(el => el.textContent); console.log(valor2); k++ if(k == Number(matches)) { console.log('Número de wallets extraídas --->',k); } } await page.click('.ant-pagination-next > button:nth-child(1)'); } await res.end(); await browser.close(); })Cuando haga esto, el código raspará 2 páginas y media (en lugar de 1 página). Por favor, déjeme saber si funciona.