2016-11-25 9 views
0

Webアドレスから複数のWebファイルをダウンロードして読み込むコードを書いていますが、手動で各ファイルを手動でクリックして開くと機能します。これはウェブサイトがロックされているためで、関連するWebページを手動でクリックすると、コードはロックアウトされずにファイルを読み取ることができるからです。ロックされたWebサイトからのデータのインポート

私のコードは次のとおりです。ここで

VAR=c('tas', 'tasmin', 'tasmax', 'pr') 
RCP=c('rcp26', 'rcp45', 'rcp60', 'rcp85') 
SEQ=sprintf('%0.3d', 0:20) 

for(i in VAR){ 
    for(j in RCP){ 
    for(k in SEQ){ 

FILES=read.table(paste0("https://climexp.knmi.nl/data/icmip5_", 
i, "_Amon_mod_", j, "_5-7.5E_50-52.5N_n_su_", k, ".dat")) 

colnames(FILES)=c("YEAR", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", 
"JUL", "AUG", "SEP", "OCT", "NOV", "DEC") 
write.table(FILES, file=paste0("C:/.../", i, "-", j, "-", k, ".txt"), sep="\t") 
    } 
    } 
} 

は、多くのファイルの1本輸入へのリンクです:

https://climexp.knmi.nl/data/icmip5_tasmin_Amon_mod_rcp45_5-7.5E_50-52.5N_n_su_000.dat

私が上で手動でそれを行っているので、これが私のために開きますあなたがそれをクリックすると、おそらく正しく開くことはありません。これが問題です。これらのウェブサイトがロックされている/パスワードで保護されていることを認識するために私のコードを修正する必要があり、私は何とか最初にウェブサイトのロックを解除し、上記のようにダウンロードする必要があります。

アイデア?

+0

JavaScriptがインスタンスを前面に渡した後にデータが返される可能性はありますか?もしそうなら、自分でページを "訪問"してデータを返すことができるスクレイパーが必要です。 PhantomJSが気になります。しかし、それ以上先に進む前に、データスクレイピングが許可されているかどうかサイトポリシーを確認してください。残念ながら(OPのために) –

+1

@RomanLuštrikは、フォームが選択された後にサイトがデータファイルを動的に生成しているということです。私は彼らがある期間キャッシュされていると仮定しています。これが動作する唯一の方法は、フォームが 'rvest'または' RSelenium'を介してインストゥルメントされている場合です。 – hrbrmstr

+0

注意: '.dat'ファイルはまだキャッシュされていない可能性が高いため、私には利用可能でした。 – hrbrmstr

答えて

0

あなたがデータを取得するために取った「クリックパス」がなくても、私があなたのためにできることは、あなたがさらに探検する必要がある場所を特定する方法を示すことです。

Chromeで「デベロッパーツール」を開いてhttps://climexp.knmi.nl/に行きました。https://climexp.knmi.nl/[email protected]にリダイレクトされ、「Monthly CMIP5 scenario runs」が選択されました。そこでは、「CMIP5 mean」行で「tas」の下に「1」を選択し、「Select field」をクリックしました。それは別のページを表示し、あなたの緯度/経度を「グリッドポイント、平均面積を得るか、サブセットを生成する」テーブルボックスに入力し、「時系列を作る」をクリックしました。その結果、チャートとリンクの結果ページが表示され、データをダウンロードできました。

ブラウザの場所バーにパラメータが入力されていない(つまり、GETリクエストではない)ため、後続の各URLに何が渡されているかを調べていたので、私は「開発ツール」を持っていました。ありがたいことに、これらのリクエストに関連する「セッション」やクッキーはなく、プロセスは繰り返し可能であるようです(「tasmin」と「tasmax」の下で「トリック」を試してみました。 (ページ全体を取得し

library(httr) 
library(rvest) 

res <- POST(url = "https://climexp.knmi.nl/get_index.cgi", 
      body = list(email = "[email protected]", 
         field = "cmip5_tas_Amon_modmean_rcp26", 
         maskmetadata = "", 
         lat1 = "50", 
         lat2 = "52.5", 
         lon1 = "5", 
         lon2 = "7.5", 
         intertype = "nearest", 
         gridpoints = "false", 
         masktype = "all", 
         standardunits = ""), 
      encode = "form") 

私は「.cgiの」リンク「の開発者向けツール」の「カールとしてコピー」を使用してhttr動詞の呼び出しにそれを変換するためにcurlconverterパッケージを使用しましたチャートとデータへのリンクを持つもの)。私たちは、そのページ読むことができます:

pg <- content(res) 

をし、それ上のデータへのすべてのリンクを見つける:

html_nodes(pg, "a") %>% 
    html_attr("href") %>% 
    grep("^data", ., value=TRUE) 

## [1] "data/icmip5_tasmax_Amon_modmean_rcp26_5-7.5E_50-52.5N_n_+++.eps.gz"  
## [2] "data/icmip5_tasmax_Amon_modmean_rcp26_5-7.5E_50-52.5N_n_+++__yr.eps.gz" 
## [3] "data/icmip5_tasmax_Amon_modmean_rcp26_5-7.5E_50-52.5N_n_+++__yr.txt" 
## [4] "data/icmip5_tasmax_Amon_modmean_rcp26_5-7.5E_50-52.5N_n_+++_a.eps.gz" 
## [5] "data/icmip5_tasmax_Amon_modmean_rcp26_5-7.5E_50-52.5N_n_+++_a.txt"  

を、それらのどれも.datファイルではないが、それが原因私にprblyです同じことを選択しませんオプションはあなたと同じです。

これはあなたのところにあなたを得るはずです。

関連する問題