El titiritero JS solo devuelve el encabezado HTML mientras se puede ver HTML completo en las herramientas de desarrollo de Chrome -- javascript campo con html campo con node.js campo con single-page-application campo con puppeteer camp Relacionados El problema

Puppeteer js return only html header while full html can be seen in chrome's dev tools


-2
vote

problema

Español

Estoy usando el titiritero JS en mi aplicación JS del nodo JS para Scrape un sitio web de letras, con una URL que apunta a los resultados de consulta (a través de la consulta de URL), como SO:

https://shironet.mako.co.il/search?q=fire

En este ejemplo, el término de consulta es "Fuego".

El problema es que creo que este sitio web está construido con un marco de spa, porque no importa cómo intente buscar el HTML, solo obtengo el encabezado que está lleno de algunas funciones de JS comprimido, y vacío del cuerpo HTML. < / p>

Cuando inspecciono la página en Mis DevTools, veo HTML normal.

Este es el código de raspado :

  'use strict' const pup = require('puppeteer'),     cherrio = require('cheerio'),     baseUrl = 'https://shironet.mako.co.il/search?q=';  async function findInitialData(songName){     if(!songName){         return 'no song name to scrape'     }     console.log(`start findInitialData with songName: ${songName}`)          console.time('initial-scrape')     pup.launch({         headless: true     }).then(         async browser =>{             let final = []             const page = await browser.newPage()             console.log(`there is a page`)                          await page.goto(`${baseUrl}/${songName}`),{waitUntil:'networkidle2'}             await page.waitFor(10 * 1000);             const html = await page.content()             console.log(`html: `,html)                          const $ = cherrio.load(html)             $('a.search_link_name_big').each((index,val)=>{                 console.log(`val: `,val)                                  let text =  $(value).text().replace(/[  ]/gi, '')                 let link = $(value).attr('href')                 if(index%2==1){                     obj = {}                     obj["singer"]=text                     final.push(obj)                 }                 else{                     obj['link']= link                     obj['song'] = text                 }                 console.log(`final: `,final)                 browser.close()                 setTimeout(() => {                     console.timeEnd('initial-scrape')                     return final                 }, 3000);                              })         }     ) }   module.exports = {findInitialData}   

Cuando uso la opción sin cabeza: la opción falsa veo en los devteols que el cuerpo está vacío (y el encabezado se llena con las mismas funciones) y la página no está cargando en absoluto.

Esta es parte de la respuesta que recibo, tanto en la cabeza) y no sin cabeza:

  <html><head><meta charset="utf-8"><script>function i700(){}i700.F20=function (){return typeof i700.O20.p60==='function'?i700.O20.p60.apply(i700.O20,arguments):i700.O20.p60;};i700.X70=function (){return typeof i700.v70.p60==='function'?i700.v70.p60.apply(i700.v70,arguments):i700.v70.p60;};i700.Z20=function (){return typeof i700.O20.P20==='function'?i700.O20.P20.apply(i700.O20,arguments):i700.O20.P20;};i700.Q60=function (){return typeof i700.Y60.P20==='function'? ... ;winsocks();</script></head><body></body></html>   

Algunos de los HTML que se muestran en los DevTools:

      <tbody><tr>         <td class="global_main_shadow" align="center">             <table width="1020" cellspacing="0" cellpadding="0" border="0">                 <tbody><tr>                     <td width="20" valign="top" align="left">                          <img src="/jsp/images/global_bg_right.gif" width="20" height="556"></td> ...   </tbody>   

¿Qué estoy haciendo mal?

Porque sin ningún cuerpo falla la parte de Cheerio, y la función no funciona.

Vi algunas respuestas de regañador de asuntos similares aquí y en Google, pero para ellos. La página.Waitfor y la adición de Waituntil NetworkIDLE2 lo solucionó, pero no para mí.

Editar:

Intenté enviar solicitudes de la misma URL usando herramientas como Axios e insomnio, y obtuvieron la respuesta del cuerpo vacío.

Cuando usé postman, sin embargo, obtuve el HTML correcto.

¿Qué le da a Postman? ¿Está bien que cualquier otra herramienta está haciendo mal?

¡Cualquier ayuda será apreciada!

Original en ingles

I'm using puppeteer js in my node js application in order to scrape a lyrics website, with a url that points to query results (via url query), like so:

https://shironet.mako.co.il/search?q=fire

In this example the query term is "fire".

The problem is that I believe that this website is built with some spa framework, because no matter how I try to fetch the HTML, I get only the header that is filled with some compressed js functions, and empty html body.

When I inspect the page in my devtools, I see normal HTML.

This is the scraping code:

'use strict' const pup = require('puppeteer'),     cherrio = require('cheerio'),     baseUrl = 'https://shironet.mako.co.il/search?q=';  async function findInitialData(songName){     if(!songName){         return 'no song name to scrape'     }     console.log(`start findInitialData with songName: ${songName}`)          console.time('initial-scrape')     pup.launch({         headless: true     }).then(         async browser =>{             let final = []             const page = await browser.newPage()             console.log(`there is a page`)                          await page.goto(`${baseUrl}/${songName}`),{waitUntil:'networkidle2'}             await page.waitFor(10 * 1000);             const html = await page.content()             console.log(`html: `,html)                          const $ = cherrio.load(html)             $('a.search_link_name_big').each((index,val)=>{                 console.log(`val: `,val)                                  let text =  $(value).text().replace(/[\n\t]/gi, '')                 let link = $(value).attr('href')                 if(index%2==1){                     obj = {}                     obj["singer"]=text                     final.push(obj)                 }                 else{                     obj['link']= link                     obj['song'] = text                 }                 console.log(`final: `,final)                 browser.close()                 setTimeout(() => {                     console.timeEnd('initial-scrape')                     return final                 }, 3000);                              })         }     ) }   module.exports = {findInitialData} 

when I use the headless:false option I see in the devtools that the body is empty (and the header is filled with the same functions) and the page is not loading at all.

This is some of the response I get, both in headless and non-headless:

<html><head><meta charset="utf-8"><script>function i700(){}i700.F20=function (){return typeof i700.O20.p60==='function'?i700.O20.p60.apply(i700.O20,arguments):i700.O20.p60;};i700.X70=function (){return typeof i700.v70.p60==='function'?i700.v70.p60.apply(i700.v70,arguments):i700.v70.p60;};i700.Z20=function (){return typeof i700.O20.P20==='function'?i700.O20.P20.apply(i700.O20,arguments):i700.O20.P20;};i700.Q60=function (){return typeof i700.Y60.P20==='function'? ... ;winsocks();</script></head><body></body></html> 

Some of the HTML shown in the devtools:

    <tbody><tr>         <td class="global_main_shadow" align="center">             <table width="1020" cellspacing="0" cellpadding="0" border="0">                 <tbody><tr>                     <td width="20" valign="top" align="left">                          <img src="/jsp/images/global_bg_right.gif" width="20" height="556"></td> ...   </tbody> 

What am I doing wrong?

Because without any body the cheerio part fails, and the function doesn't works.

I saw some answers regrading similar issues here and in google, but for them page.waitFor and adding waitUntil networkidle2 solved it, but not for me.

EDIT:

I tried to send requests for the same URL using tools like axios and insomnia, and they got the empty body response.

When I used postman though, I got the correct HTML.

What postman does right that any other tools is doing wrong?

Any help will be appreciated!

              
       
       

Lista de respuestas

0
 
vote
vote
La mejor respuesta
 
  const fetch = require("node-fetch");  (async () => {   const url = "https://shironet.mako.co.il/search?q=fire";   const result = await fetch(url);   const response = await result.text();   console.log(response); })();   

trabajó en mi máquina.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

 
const fetch = require("node-fetch");  (async () => {   const url = "https://shironet.mako.co.il/search?q=fire";   const result = await fetch(url);   const response = await result.text();   console.log(response); })(); 

It worked on my machine.

enter image description here

enter image description here

 
 
     
     

Relacionados problema

1  ¿Expresiones XPath en lugar de los selectores de CSS en titiritero?  ( Xpath expressions instead of css selectors in puppeteer ) 
Por ejemplo, el document.querySelectorAll funciona con los selectores CSS, pero ¿cómo puedo usar las expresiones XPath en su lugar? ...

0  ¿Hay alguna manera de desplazarse indefinidamente en Spotify usando titiritero?  ( Is there a way to indefinitely scroll on spotify using puppeteer ) 
Soy nuevo en Nodo.js y titiritero y yo estaba tratando de encontrar una manera de desplazarse hasta el final de una lista de reproducción para raspar los nomb...

91  Cómo hacer clic en el elemento con texto en titiritero  ( How to click on element with text in puppeteer ) 
¿Hay algún método (no encontrado en API) o solución para hacer clic en el elemento con texto? Por ejemplo, tengo HTML: <div class="elements"> <button...

24  Inyectar jQuery en la página del titiritero  ( Inject jquery into puppeteer page ) 
Estoy tratando de inyectar jQuery en la página de mi titiritero porque document.querySelector no lo reduce: async function inject_jquery(page){ await p...

0  Creación de archivos y guardando a un nodejs variable  ( Creating file and saving to a variable nodejs ) 
Estoy usando titiritero para rastrear un sitio web. Mi objetivo es poder enviar una imagen de captura de pantalla y un archivo HTML en la respuesta. Mi códi...

6  ¿Se puede generar un archivo HAR para generar programáticamente desde el cromo sin cabeza usando titiritero?  ( Can a har file be programmatically generated from headless chrome using puppetee ) 
Me gustaría controlar una instancia de cromo sin cabeza usando titiritero, tomando instantáneas y haciendo clic en varios elementos de la página, mientras se ...

1  Lanzamiento de cromo con titiritero (no cromo)  ( Launching chrome with puppeteer not chromium ) 
Intenté lanzar cromo con titiritero, pero me dio este error Error: ¡Error al iniciar el proceso del navegador! Spawn // C: // Archivos de programa (x86) //...

3  PYPTETER: El navegador cerró inesperadamente en AWS Lambda  ( Pyppeteer browser closed unexpectedly in aws lambda ) 
Estoy corriendo en este error en Aws Lambda. Parece que el WebSocket de DevTools no está arriba. No estoy seguro de cómo repararlo. ¿Algunas ideas? Gracias po...

2  ¿Cómo verificar con el titiritero o el dramaturgo si un elemento es de un color específico?  ( How to check with puppeteer or playwright if an element is of a specific color ) 
Tengo un elemento que tiene este color de estilo: # DC7709 y quiero verificar si el texto del elemento es de ese color. ¿Cómo hago eso con titiritero o dramat...

1  Titiritero: el primer trabajo de enlace, los otros no  ( Puppeteer the first link work the others dont ) 
Este es mi primer post. Estoy aprendiendo js con nodejs. Así que vi al guión titiritero para tomar capturas de pantalla de los elementos y lo copio y lo cambi...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos