2017-07-07 13 views
0

私は公開データプロバイダをスクレープしようとしていますが、JSにパラメータを渡すボタンをクリックしなければならなくなってしまいました。ここに私の試みです:rvestを使用してdata-paramsとのリンクをとる方法

node_link
require(rvest) 
url <- 'https://myterna.terna.it/SunSet/Public/' 
page <- url %>% read_html() 
node_link <- page %>% html_node('.sub-item:nth-child(1) .postlink') 

私は簡単にこのHTMLタグのhrefとして目的のページを見つけることができます。

<a href="/SunSet/Public/Pubblicazioni" 
    class="postlink" 
    data-params="filter.IdSezione=52767620567B3077E053A8829B0A9478"> 

ポイントは、私は簡単にするのでリンク先のページの内容を取得できないということです同じリンクを指す他のボタンがあります。さまざまなボタンの唯一の違いは、data-params属性です。この属性は、特定のコンテンツを取得するためにJSに与えられている可能性があります。

問題を解決する方法についてのご意見はありますか?

答えて

1

義務ヘッドアップ:

サイトはこする許す場合にはLegal Notice認可提供、個人的な使用のためではなく、商業目的のためだけに、このウェブサイトに掲載された文書の再生のために付与されていると言い、本当にはっきりしていませんソースの名前が正しく示されています。

これは利用規約に基づいて使用してください。

そのリンクをクリックするとネットワークの動作を調べると、ウェブページがPOSTリクエストをhttps://myterna.terna.it/SunSet/Public/Pubblicazioni/Listにしていることがわかります。リクエストされたheadersparamsが見つかりました。

par <- '{"draw":1,"columns":[{"data":0,"name":"","searchable":true,"orderable":true,"search":{"value":"","regex":false}},{"data":1,"name":"","searchable":true,"orderable":true,"search":{"value":"","regex":false}},{"data":2,"name":"","searchable":false,"orderable":false,"search":{"value":"","regex":false}},{"data":3,"name":"","searchable":false,"orderable":false,"search":{"value":"","regex":false}},{"data":4,"name":"","searchable":false,"orderable":false,"search":{"value":"","regex":false}},{"data":5,"name":"","searchable":false,"orderable":false,"search":{"value":"","regex":false}},{"data":6,"name":"","searchable":false,"orderable":false,"search":{"value":"","regex":false}},{"data":7,"name":"","searchable":false,"orderable":false,"search":{"value":"","regex":false}}],"order":[],"start":0,"length":10,"search":{"value":"","regex":false},"filter":{"IdSezione":"52767620567B3077E053A8829B0A9478","Titolo":"","Id":"","ExtKey":"","TipoPubblicazione":"","SheetName":"","Anno":"2017","Mese":"7","Giorno":"","DataPubblicazione":"","TipoDatoPubblicazione":""},"details":{}}' 

これはjsonである私たちが望む場合は、ヘッダーのみX-Requested-With:MLHttpRequestが本当にあるように、我々は(私はいくつかの異なるフィルタを試し、それがはるかに何の応答もしませんが)

par <- jsonlite::fromJSON(par) 
par$filter$Mese <- '7' 

をその値を解析し、変更することができます私たちはそれを切り捨てることができるように必要でした。

response <- POST('https://myterna.terna.it/SunSet/Public/Pubblicazioni/List', 
    add_headers('X-Requested-With' = 'XMLHttpRequest'), 
    body = par, 
    encode = 'json') 

json_data <- content(response)$data 

これは、私たちが安全に便利に使用するためのデータフレームに変換することができ、リストを返します。

df <- data.frame(matrix(unlist(json_data), nrow=length(json_data), byrow=TRUE)) 

head(df, 2) 
#>                  X1 
#> 1  SbilanciamentoAggregatoZonale_SegnoGiornaliero_Orario_20170709 
#> 2 SbilanciamentoAggregatoZonale_SegnoGiornaliero_QuartoOrario_20170709 
#>      X2 
#> 1 /Date(1499680800000)/ 
#> 2 /Date(1499680800000)/ 
#>                       X3 
#> 1 <div class="actions detail-inline export" data-pk="53F4A57FCB70304EE0532A889B0A7758"></div> 
#> 2 <div class="actions detail-inline export" data-pk="53F4A57FCB6D304EE0532A889B0A7758"></div> 
#>         X4 X5        X6 
#> 1 53F4A57FCB70304EE0532A889B0A7758 25  SEGNO_MACROZONALE_ORARIO 
#> 2 53F4A57FCB6D304EE0532A889B0A7758 25 SEGNO_MACROZONALE_QUARTO_ORARIO 
#>     X7   X8 
#> 1 Segno Giornaliero  Orario 
#> 2 Segno Giornaliero Quarto Orario 
+0

は、あなたがポイントを持って、あなたに@GGambaをありがとう!私は、Webの周りにこのテーマにはあまりないと思うので、あなたの貢献は間違いなく便利です! –

1

わかりました。基本的に、HTTPの仕組みが欠けていました。研究のいくつかの日後、私は正しいアプローチがhttrのパッケージを使用していることを理解しました。

私は公共のページから必要なすべての設定を取得し、すべてのファースト:

lnkd_url <- paste0(dirname(dirname(url)), 
        node_link %>% 
         html_attr('href')) 
lnkd_id <- strsplit(zs_node %>% 
         html_attr('data-params'), '=')[[1]][2] 

そして、目的のページにPOSTリクエストを起動することが可能である:

lnkd_page <- POST(lnkd_url, 
        body = list('filter.IdSezione' = lnkd_id) 

それだそれ!

関連する問題