2015-12-26 13 views
5

Sto testando alcuni script di raschiatura web in R. Ho letto molti tutorial, documenti e provato diverse cose ma nessun successo fino ad ora.R raschietto web con jsessionid

L'URL che sto cercando di racchiudere è this one. Ha dati pubblici, governativi e non dichiarazioni contro i web scrapers. È in portoghese, ma credo che non sarà un grosso problema.

Mostra un modulo di ricerca, con diversi campi. Il mio test stava cercando dati da uno stato particolare ("RJ", in questo caso il campo è "UF"), e città ("Rio de Janeiro", nel campo "MUNICIPIO"). Cliccando "Pesquisar" (ricerca), mostra il seguente output:

enter image description here

Usando Firebug, ho trovato l'URL che chiama (utilizzando i parametri di cui sopra) è:

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 

Il sito utilizza un jsessionid, come si può vedere usando la seguente:

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

Sapendo che utilizza un jsessionid, ho usato i biscotti (URL) per verificare queste informazioni, e lo ha utilizzato in un nuovo URL In questo modo:

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) 

Bene, l'output non ha i dati. In effetti, ha un messaggio di errore. Tradotto in inglese, in pratica dice che la sessione è scaduta.

Suppongo sia un errore di base, ma mi sono guardato intorno e non ho trovato il modo di superarlo.

risposta

3

Questa combinazione ha funzionato per me:

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 ... 

ho usato BurpSuite a ispezionare cosa stava succedendo e ha fatto un rapido test dalla riga di comando con l'uscita da "Copia come cURL" e aggiungendo --verbose per potevo convalidare ciò che è stato inviato/ricevuto. Ho quindi imitato i parametri curl.

Iniziando alla pagina di ricerca nuda, i cookie per l'id di sessione e il server bigip sono già stati riscaldati (cioè verranno inviati con ogni richiesta in modo da non doverli confondere) MA è ancora necessario compilarlo sul percorso dell'URL in modo che dobbiamo recuperarli, quindi riempirlo.

+0

Grazie mille, hrbmstr. Ha funzionato bene! –

Problemi correlati