scraping - Rvest no reconoce el selector css
rvest tutorial (2)
Estoy tratando de raspar este sitio web:
a través del paquete de rvest
en R.
Desafortunadamente, parece que rvest
no reconoce los nodos a través del selector de CSS.
Por ejemplo, si trato de extraer la información en el encabezado de cada tabla (Grado, Premio, Distancia), cuyo selector de CSS es ".black" y ejecuto este código:
URL <- read_html("http://www.racingpost.com/greyhounds/result_home.sd#resultDay=2015-12-26&meetingId=18&isFullMeeting=true")
nodes<-html_nodes(URL, ".black")
nodes sale como una lista nula, por lo que no está raspando nada.
Está haciendo una solicitud XHR para generar el HTML. Pruebe esto (lo que también debería facilitar la automatización de la captura de datos):
library(httr)
library(xml2)
library(rvest)
res <- GET("http://www.racingpost.com/greyhounds/result_by_meeting_full.sd",
query=list(r_date="2015-12-26",
meeting_id=18))
doc <- read_html(content(res, as="text"))
html_nodes(doc, ".black")
## {xml_nodeset (56)}
## [1] <span class="black">A9</span>
## [2] <span class="black">£61</span>
## [3] <span class="black">470m</span>
## [4] <span class="black">-30</span>
## [5] <span class="black">H2</span>
## [6] <span class="black">£105</span>
## [7] <span class="black">470m</span>
## [8] <span class="black">-30</span>
## [9] <span class="black">A7</span>
## [10] <span class="black">£61</span>
## [11] <span class="black">470m</span>
## [12] <span class="black">-30</span>
## [13] <span class="black">A5</span>
## [14] <span class="black">£66</span>
## [15] <span class="black">470m</span>
## [16] <span class="black">-30</span>
## [17] <span class="black">A8</span>
## [18] <span class="black">£61</span>
## [19] <span class="black">470m</span>
## [20] <span class="black">-20</span>
## ...
Tu selector es bueno y rvest
está funcionando bien. El problema es que lo que estás buscando no está en el objeto url
.
Si abre ese sitio web y utiliza la herramienta de inspección del navegador web, verá que todos los datos que desea son descendientes de <div id="resultMainOutput">
. Ahora, si busca el código fuente de este sitio web, lo hará (se agregarán saltos de línea para facilitar la lectura):
<div id="resultMainOutput">
<div class="wait">
<img src="http://ui.racingpost.com/img/all/loading.gif" alt="Loading..." />
</div>
</div>
Los datos que desea se cargan dinámicamente y rvest
no puede hacer frente a eso. Solo puede recuperar el código fuente del sitio web y recuperar todo lo que hay sin procesamiento del lado del cliente.
El mismo problema se planteó en la publicación de blog de la versión rvest y aquí está lo que el autor del paquete tuvo que decir:
Tienes dos opciones para páginas como esa:
Use la consola de depuración en el navegador web para realizar una ingeniería inversa del protocolo de comunicaciones y solicite los datos brutos directamente desde el servidor.
Use un paquete como RSelenium para automatizar un navegador web.
Si no necesita obtener esos datos repetidamente, o puede aceptar un poco de trabajo manual en cada análisis, la solución más fácil es:
- Abrir el sitio web en el navegador web de elección
- Utilizando la herramienta de inspección del navegador web, copie el contenido actual del sitio web (página completa o solo
<div id="resultMainOutput">
contenido) - Pega esa cosa en el editor de texto y guárdalo como un archivo nuevo
- Ejecutar análisis en ese archivo
> url <- read_html("/tmp/racingpost.html")
> html_nodes(url, ".black")
# {xml_nodeset (56)}
# [1] <span class="black">A9</span>
# [2] <span class="black">£61</span>
# [3] <span class="black">470m</span>
# [4] <span class="black">-30</span>
# (skip the rest)
Como puede ver, hay algunos problemas de codificación en el camino, pero se pueden resolver más adelante.