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!
¡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!
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:
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:
sendKeys para activar el evento de tecla Page Down )