2015-12-26 4 views
5

私はRでいくつかのWebスクレープスクリプトをテストしています。私は多くのチュートリアルやドキュメントを読んでいますが、今までは成功していないものを試しました。R web scraper with jsessionid

私が掻き取ろうとしているURLはthis oneです。それには公開、政府データ、Webスクレイパーに対する声明はありません。ポルトガル語ですが、大きな問題ではないと思います。

いくつかのフィールドを含む検索フォームを示します。私のテストでは、特定の州( "RJ"、このフィールドは "UF")と都市( "Rio de Janeiro"、フィールド "MUNICIPIO")のデータを検索していました。 "Pesquisar"(検索)をクリックすると、それは次の出力を示しています。

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 

サイト:Firebugのを使用して

enter image description here

を、私はそれが(上記のパラメータを使用して)を呼び出すURLが見つかりました次を使用して見ることができるように、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を使用していた「のcURLとしてコピー」からの出力と、コマンドラインでの簡単なテストをし、私に--verboseを追加します何が送受信されているかを検証する。私はcurlのパラメータを模倣しました。

裸の検索ページから開始すると、セッションIDとbigipサーバーのCookieは既にウォームアップされています(つまり、すべての要求が送信されるため、それらを混乱させる必要はありません)。 URLパスに入力して検索してから入力してください。

+0

ありがとう、hrbmstr。それはうまくいった! –