tutorial selectorgadget scraping paquete page hacer espaƱol con como r web-scraping httr rvest

selectorgadget - R web scraper con jsessionid



selectorgadget firefox (1)

Estoy probando algunos guiones de raspado web en R. He leído muchos tutoriales, documentos y he probado diferentes cosas pero hasta ahora no he tenido éxito.

La URL que trato de borrar es esta . Tiene datos públicos, gubernamentales y ninguna declaración contra raspadores web. Está en portugués, pero creo que no será un gran problema.

Muestra un formulario de búsqueda, con varios campos. Mi prueba fue buscar datos de un estado en particular ("RJ", en este caso el campo es "UF"), y ciudad ("Rio de Janeiro", en el campo "MUNICIPIO"). Al hacer clic en "Pesquisar" (Buscar), se muestra el siguiente resultado:

Usando Firebug, encontré que la URL que llama (usando los parámetros anteriores) es:

http://www.dataescolabrasil.inep.gov.br/dataEscolaBrasil/home.seam?buscaForm=buscaForm&codEntidadeDecorate%3AcodEntidadeInput=&noEntidadeDecorate%3AnoEntidadeInput=&descEnderecoDecorate%3AdescEnderecoInput=&estadoDecorate%3A**estadoSelect=33**&municipioDecorate%3A**municipioSelect=3304557**&bairroDecorate%3AbairroInput=&pesquisar.x=42&pesquisar.y=16&javax.faces.ViewState=j_id10

El sitio usa una jsessionid, como se puede ver usando lo siguiente:

library(rvest) library(httr) url <- GET("http://www.dataescolabrasil.inep.gov.br/dataEscolaBrasil/") cookies(url)

Sabiendo que usa una jsessionid, utilicé las cookies (url) para verificar esta información y la utilicé en una nueva URL como esta:

url <- read_html("http://www.dataescolabrasil.inep.gov.br/dataEscolaBrasil/home.seam;jsessionid=008142964577DBEC622E6D0C8AF2F034?buscaForm=buscaForm&codEntidadeDecorate%3AcodEntidadeInput=33108064&noEntidadeDecorate%3AnoEntidadeInput=&descEnderecoDecorate%3AdescEnderecoInput=&estadoDecorate%3AestadoSelect=org.jboss.seam.ui.NoSelectionConverter.noSelectionValue&bairroDecorate%3AbairroInput=&pesquisar.x=65&pesquisar.y=8&javax.faces.ViewState=j_id2") html_text(url)

Bueno, la salida no tiene los datos. De hecho, tiene un mensaje de error. Traducido al inglés, básicamente dice que la sesión había expirado.

Supongo que es un error básico, pero miré alrededor y no pude encontrar una manera de superar esto.


Esta combinación funcionó para mí:

library(curl) library(xml2) library(httr) library(rvest) library(stringi) # warm up the curl handle start <- GET("http://www.dataescolabrasil.inep.gov.br/dataEscolaBrasil/home.seam") # get the cookies ck <- handle_cookies(handle_find("http://www.dataescolabrasil.inep.gov.br/dataEscolaBrasil/home.seam")$handle) # make the POST request res <- POST("http://www.dataescolabrasil.inep.gov.br/dataEscolaBrasil/home.seam;jsessionid=" %s+% ck[1,]$value, user_agent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:40.0) Gecko/20100101 Firefox/40.0"), accept("*/*"), encode="form", multipart=FALSE, # this gens a warning but seems to be necessary add_headers(Referer="http://www.dataescolabrasil.inep.gov.br/dataEscolaBrasil/home.seam"), body=list(`buscaForm`="buscaForm", `codEntidadeDecorate:codEntidadeInput`="", `noEntidadeDecorate:noEntidadeInput`="", `descEnderecoDecorate:descEnderecoInput`="", `estadoDecorate:estadoSelect`=33, `municipioDecorate:municipioSelect`=3304557, `bairroDecorate:bairroInput`="", `pesquisar.x`=50, `pesquisar.y`=15, `javax.faces.ViewState`="j_id1")) doc <- read_html(content(res, as="text")) html_nodes(doc, "table") ## {xml_nodeset (5)} ## [1] <table border="0" cellpadding="0" cellspacing="0" class="rich-tabpanel " id="j_id17" sty ... ## [2] <table border="0" cellpadding="0" cellspacing="0">/n <tr>/n <td>/n <img alt="" ... ## [3] <table border="0" cellpadding="0" cellspacing="0" id="j_id18_shifted" onclick="if (RichF ... ## [4] <table border="0" cellpadding="0" cellspacing="0" style="height: 100%; width: 100%;">/n ... ## [5] <table border="0" cellpadding="10" cellspacing="0" class="dr-tbpnl-cntnt-pstn rich-tabpa ...

Utilicé BurpSuite para inspeccionar lo que estaba sucediendo e hice una prueba rápida en la línea de comando con la salida de "Copiar como cURL" y --verbose para poder validar lo que se estaba enviando / recibiendo. Luego imité los parámetros de curl .

Al comenzar en la página de búsqueda simple, las cookies para la identificación de la sesión y el servidor de bigip son ya calentadas (es decir, se enviarán con cada solicitud para que no tenga que meterse con ellas) PERO aún necesita completarlas en la ruta de la URL, así que tenemos que recuperarlos y luego completarlos.