2015-12-26 15 views
5

Tôi đang thử nghiệm một số đoạn mã trên web trong R. Tôi đã đọc nhiều hướng dẫn, tài liệu và đã thử nhiều thứ khác nhau nhưng không thành công cho đến nay.R web scraper với jsessionid

URL tôi đang cố gắng xóa là this one. Nó có dữ liệu công khai, chính phủ và không có tuyên bố nào chống lại kẻ lừa đảo web. Nó bằng tiếng Bồ Đào Nha, nhưng tôi tin rằng nó sẽ không phải là một vấn đề lớn.

Nó hiển thị biểu mẫu tìm kiếm, với một số trường. Thử nghiệm của tôi đã tìm kiếm dữ liệu từ một trạng thái cụ thể ("RJ", trong trường hợp này là trường "UF") và thành phố ("Rio de Janeiro", trong trường "MUNICIPIO"). Bằng cách nhấp vào "Pesquisar" (Tìm kiếm), nó cho thấy đầu ra sau đây:

enter image description here

Sử dụng Firebug, tôi thấy URL mà họ gọi (sử dụng các thông số ở trên) là:

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 

Các trang web sử dụng một jsessionid, như có thể thấy bằng cách sử dụng sau đây:

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

biết nó sử dụng một jsessionid, tôi sử dụng cookie (url) để kiểm tra thông tin này, và sử dụng nó vào một URL mới như thế này:

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) 

Vâng, đầu ra không có dữ liệu. Trong thực tế, nó có một thông báo lỗi. Dịch sang tiếng Anh, về cơ bản nói rằng phiên đã hết hạn.

Tôi cho rằng đó là một sai lầm cơ bản, nhưng tôi nhìn quanh và không thể tìm ra cách để vượt qua điều này.

Trả lời

3

Sự kết hợp này làm việc cho tôi:

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

tôi đã sử dụng BurpSuite để kiểm tra những gì đã xảy ra và đã làm một thử nghiệm nhanh tại dòng lệnh với sản lượng từ "Sao chép như cURL" và thêm --verbose để tôi có thể xác nhận những gì đã được gửi/nhận. Sau đó tôi bắt chước các tham số curl.

Bằng cách bắt đầu từ trang tìm kiếm trống, cookie cho id phiên và máy chủ bigip đã được khởi động (tức là sẽ được gửi với mọi yêu cầu để bạn không phải gây rối với chúng) NHƯNG bạn vẫn cần điền vào trên đường dẫn URL để chúng tôi phải truy xuất chúng, sau đó điền vào.

+0

Cảm ơn rất nhiều, hrbmstr. Nó hoạt động rất tốt! –

Các vấn đề liên quan