gpt4 book ai didi

html - 如何使用 rvest 跟踪带有数据参数的链接

转载 作者:太空宇宙 更新时间:2023-11-04 01:43:25 24 4
gpt4 key购买 nike

我正在尝试通过网络抓取公共(public)数据提供程序,但当我不得不单击将参数传递给 JS 的按钮时,我卡住了。这是我的尝试:

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

node_link 中,我可以轻松找到目标页面作为此 HTML 标记的 href:

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

关键是我无法轻松检索链接页面的内容,因为还有其他按钮指向相同的链接。各种按钮之间的唯一区别是 data-params 属性,可能必须将其提供给 JS 才能检索特定内容。

关于如何解决这个问题有什么想法吗?

最佳答案

强制性提示:

目前尚不清楚网站是否允许抓取,法律声明授权复制本网站上发布的文件,仅供个人使用,不得用于商业目的,前提是来源名称已正确标明。

在遵守他们的服务条款的情况下使用它。

单击该链接时检查网络事件,我们可以看到网页向 https://myterna.terna.it/SunSet/Public/Pubblicazioni/List 发出了 POST 请求。我们可以找到请求的 headers 和发送的 params

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,我们可以根据需要解析和更改它的值(尽管我尝试了几个不同的过滤器,但它没有太多响应)

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

至于 header ,只有 X-Requested-With:MLHttpRequest 是真正需要的,因此我们可以将其缩减为那个。

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

关于html - 如何使用 rvest 跟踪带有数据参数的链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44972649/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com