Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

120
Vistas
FB carga solo los datos de ciertas publicaciones

Entonces... necesito extraer algunos datos públicos para una disertación académica de MBA de las páginas públicas de FB (relacionando la legibilidad con el compromiso, etc.)

¡El problema es que FB es tan difícil de raspar!

¡He intentado mucho!

  1. Octoparse no raspa todas las publicaciones debido a que la publicación está oculta en el desplazamiento
  2. Web scrapper (el lindo complemento de Chrome) tiene el mismo problema a pesar de que se vuelve mucho más y mucho mejor que la exageración de Octoparse.
  3. No quiero crear una aplicación de titiritero porque estoy casi seguro de que necesitará la doble verificación, por lo que tampoco funcionará.

¡Así que estoy sentado y tratando de extraer algo de jugo con una buena y vieja consola de cromo! Realmente no me importa el producto final porque lo limpiaré con expresiones regulares en Gsheets.

Pero el problema al que me enfrento es que FB me da solo las 10 publicaciones más cercanas a donde estoy en la página. Si estoy al principio me dará hasta 5 puestos. si estoy en el puesto 50 me mostrara 45-55 aprox. ¡Te dan la imagen! ¿Algunas ideas?

Aquí está mi código:

Esto es para obtener todas las publicaciones y almacenar en la matriz allelements

 let current = document.querySelector('#mount_0_0_pK > div > div:nth-child(1) > div > div.rq0escxv.l9j0dhe7.du4w35lb > div > div > div.j83agx80.cbu4d94t.d6urw2fd.dp1hu0rb.l9j0dhe7.du4w35lb > div.l9j0dhe7.dp1hu0rb.cbu4d94t.j83agx80 > div.bp9cbjyn.j83agx80.cbu4d94t.d2edcug0 > div.rq0escxv.d2edcug0.ecyo15nh.k387qaup.r24q5c3a.hv4rvrfc.dati1w0a.cxgpxx05 > div > div.rq0escxv.l9j0dhe7.du4w35lb.hpfvmrgz.g5gj957u.aov4n071.oi9244e8.bi6gxh9e.h676nmdw.aghb5jc5.gile2uim.pwa15fzy.fhuww2h9 > div > div > div > div:nth-child(1)'); let nextSibling = current.nextElementSibling; let allelements = [] allelements.push(current) while(nextSibling) { console.log(nextSibling); nextSibling = nextSibling.nextElementSibling; allelements.push(nextSibling) }

Y esto es simplemente para sacarle jugo a las publicaciones

 allelements.forEach((element, index)=>{console.log(index, element.innerText)})

El resultado final es que la matriz allelements almacena todas las publicaciones, pero solo brinda datos para las más cercanas a la posición en la que estoy. Traté de hacer que funcionara con window.scroll() pero esta es una función asíncrona y no puede trabajar. Cuando traté de trabajarlo de forma sincrónica, recibí un error de tamaño de pila...

¿¿¿algunas ideas??? ¿Quizás haya una manera de anular esta función de cargar el contenido de ciertas publicaciones?

¡Muchos gracias!

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Para abordar directamente su problema de tratar de raspar las publicaciones de FB en la consola del desarrollador, escribí un script sincrónico funcional que guarda todas las publicaciones en una matriz y su innerText en otra matriz a medida que se desplaza hacia abajo a través de la línea de tiempo de alguien. También registrará un recuento continuo de cuántas publicaciones se han eliminado y luego generará la matriz de todo el texto recopilado al finalizar.

NOTAS:

  • Puede elegir cuánto tiempo desea que la secuencia de comandos se detenga antes de volver a desplazarse hacia abajo. Elegí dos segundos porque algunas publicaciones tardaban en cargarse.
  • Mi secuencia de comandos deja de recopilar publicaciones una vez que detecta el evento generado en Facebook "Nacido el...", ya que ese es el primer elemento en la línea de tiempo. Puede elegir cualquier otro criterio que considere adecuado para detectar el final de la página. Acabo de encontrar que este es el más fácil.
  • Es más sólido no usar selectores de CSS, ya que los nombres de las clases y los identificadores cambian cada vez que se carga una nueva instancia de Facebook. Una alternativa concisa es usar xpath en su lugar, que verá a continuación.
  • Puede tener varias ventanas del navegador abiertas, pero este script solo funcionará si es la pestaña activa de su respectiva ventana del navegador.
 console.clear(); const allText = []; const allPosts = []; (function scrollAndScrape() { console.log('Total posts scraped:', allPosts.length) if ($x('//span[contains(text(), "Born on")]').length > 0) { console.log('Webscrape complete', '\n', allText) } else { let visiblePosts = $x('//div[@data-pagelet="ProfileTimeline"]/div') for (let i = 0; i < visiblePosts.length; i++) { if (!allPosts.includes(visiblePosts[i])) { allPosts.push(visiblePosts[i]) allText.push(visiblePosts[i].innerText) } window.scrollByLines(100) } setTimeout(scrollAndScrape, 2000); } })()

La salida se parece a esto:

 ... Total posts scraped: 176 Total posts scraped: 180 Total posts scraped: 187 Total posts scraped: 194 Total posts scraped: 200 Webscrape complete > Array(200) [TEXT BLOB, TEXT BLOB...]

Los blobs de texto incluirán muchos caracteres de cadena especiales, como caracteres de nueva línea ( \n ), pero una vez que ejecute su segundo fragmento de código (vea el bloque de código a continuación), el texto se imprimirá muy bien en la consola. Además, siempre puede formatear el postText como desee usando expresiones regulares.

 allText.forEach((postText, index)=>{console.log(index, postText)})

Para abordar el problema más general de que Facebook es difícil de raspar, recomendaría usar Selenium. Es compatible con Java, JavaScript, Python y Ruby. Selenium es una herramienta de navegador automatizada que admite varios controladores (Firefox, Chrome, etc.) y puede ejecutarse con o sin una GUI. Selenium está bien documentado con muchos seguidores, por lo que es fácil encontrar guías, tutoriales, etc. Todo lo que hace mi fragmento JS anterior se puede replicar con Selenium. Puedes seguir la misma lógica:

  1. Recopilar todas las publicaciones visibles en una matriz
  2. Desplácese hacia abajo (una manera fácil de hacerlo es usar el método sendKeys para activar el evento de tecla Page Down )
  3. Recopile todas las publicaciones visibles nuevas y guárdelas en la matriz
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda