2015-12-26 4 views
5

Я тестирую скрипты веб-scrape в R. Я читал много учебников, документов и пробовал разные вещи, но пока ничего не добился.R веб-скребок с jsessionid

URL-адрес, который я пытаюсь очистить, - this one. Он имеет государственные, правительственные данные и никаких заявлений против веб-скребок. Это на португальском, но я считаю, что это не будет большой проблемой.

Он показывает форму поиска с несколькими полями. Мой тест искал данные из определенного состояния («RJ», в этом случае поле «UF») и город («Рио-де-Жанейро», в поле «MUNICIPIO»). Нажав кнопку "Pesquisar" (Search), он показывает следующий вывод:

enter image description here

Использование Firebug, я нашел URL она вызывает (используя параметры выше):

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 

Сайт использует JSESSIONID, как можно увидеть, используя следующие:

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

Зная это использует JSESSIONID, я использовал печенье (URL), чтобы проверить эту информацию, и использовать его в новый URL например:

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) 

Ну, на выходе нет данных. На самом деле у него есть сообщение об ошибке. Перевод на английский язык в основном говорит о том, что сессия истекла.

Я предполагаю, что это основная ошибка, но я осмотрелся и не смог найти способ преодолеть это.

ответ

3

Эта комбинация работает для меня:

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

Я использовал BurpSuite, чтобы проверить, что происходит, и сделал быстрый тест из командной строки с выходом из «Копировать как закручивание» и добавление --verbose к я мог подтвердите, что было отправлено/получено. Затем я подражал параметрам curl.

Начиная с открытой страницы поиска, файлы cookie для идентификатора сеанса и сервера bigip уже разогреты (т. Е. Будут отправляться с каждым запросом, поэтому вам не нужно возиться с ними), но вам все равно нужно заполните его по URL-адресу, поэтому нам нужно их восстановить, а затем заполните его.

+0

Большое спасибо, hrbmstr. Это сработало красиво! –