Я хочу получить общедоступные таблицы из электросети Нью-Йорка по этому URL-адресу: http://icap.nyiso.com/ucap/public/auc_view_spot_detail.do
Я могу сделать это для летнего сезона, но не для зимнего сезона. Мне не ясно, чего мне не хватает, поэтому я надеюсь, что кто-нибудь поумнее сможет вмешаться.
Ниже приведен мой процесс, начиная со скриншота страницы.
Обведено красным выше, необходимо выбрать комбинацию Season
и Month
и нажать Display
, чтобы создать таблицы. Я скопировал информацию заголовка запроса, включая полезную нагрузку в кодировке URL-адреса, которую я включил в тело запроса POST.
# libraries
library(jsonlite)
library(lubridate)
library(data.table)
library(httr)
library(rvest)
# get session and cookies
initial_url <- "http://icap.nyiso.com/ucap/public/auc_view_spot_detail.do"
initial_response <- GET(initial_url)
cookie_data <- cookies(initial_response)
cookie_string <- paste0(cookie_data$name, " = ", cookie_data$value, collapse = "; ")
# Define the POST request headers, including cookies
headers <- c(
"Accept" = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"Accept-Encoding" = "gzip, deflate",
"Accept-Language" = "en-US,en;q=0.9",
"Cache-Control" = "max-age=0",
"Connection" = "keep-alive",
"Content-Length" = "85",
"Content-Type" = "application/x-www-form-urlencoded",
"Cookie" = cookie_string,
"Host" = "icap.nyiso.com",
"Origin" = "null",
"Upgrade-Insecure-Requests" = "1",
"User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36"
)
# Define the URL for the POST request
post_url <- "http://icap.nyiso.com/ucap/public/auc_view_spot_detail.do"
# Below is working code for a "Summer" season:
response <- POST(post_url, add_headers(.headers = headers), encode = "form",
body = "seasonId=702793&seasonId=Summer+2024&month=05%2F2024&month=May%2F2024&display=Display")
html_content <- content(response, as = "text")
html <- read_html(html_content)
tables <- html %>% html_nodes("table")
html_table(tables[4]) # print
#[[1]]
## A tibble: 45 × 2
# X1 X2
# <chr> <chr>
# 1 "05/2024" "05/2024"
# 2 "G-J Locality" "G-J Locality"
# 3 "Awarded Deficiency (MW)" "1,888.1"
# 4 "Awarded Excess (MW)" "1,694.400"
# 5 "% Excess Above Requirement" "14.78"
# 6 "Price ($/kW-M)" "$4.27"
# 7 "" ""
# 8 "LI" "LI"
# 9 "Awarded Deficiency (MW)" "176.9"
#10 "Awarded Excess (MW)" "519.200"
## ℹ 35 more rows
## ℹ Use `print(n = ...)` to see more rows
Как ни странно, этот процесс не работает, если я меняю кузов на зимний сезон, как показал осмотр в сети. Есть идеи, что мне может не хватать?
# does not work to generate the data
response <- POST(post_url, add_headers(.headers = headers), encode = "form",
body = "seasonId=702409&seasonId=Winter+2023-2024&month=02%2F2024&month=Feb%2F2024&display=Display")
html_content <- content(response, as = "text")
html <- read_html(html_content)
tables <- html %>% html_nodes("table")
html_table(tables[4]) # there is no such table
Несколько странных поведений, которые я заметил:
seasonId=702793
) на любой существующий идентификатор, если строка (seasonId=Summer+2024
) верна. Другие идентификаторы находятся здесь http://icap.nyiso.com/ucap/rest/ Seasons/public)Я также не смог найти конкретный общедоступный API-интерфейс rest для фактических данных в таблице.
Спасибо за ваше время и мысли.
И вот несколько строк тела, которые я использовал, чтобы определить, что это проблема только для зимних сезонов:
body_strings <- c("seasonId=700085&seasonId=Winter+2021-2022&month=01%2F2022&month=Jan%2F2022&display=Display",
"seasonId=700085&seasonId=Winter+2021-2022&month=02%2F2022&month=Feb%2F2022&display=Display",
"seasonId=700085&seasonId=Winter+2021-2022&month=03%2F2022&month=Mar%2F2022&display=Display",
"seasonId=700085&seasonId=Winter+2021-2022&month=04%2F2022&month=Apr%2F2022&display=Display",
"seasonId=700490&seasonId=Summer+2022&month=05%2F2022&month=May%2F2022&display=Display",
"seasonId=700490&seasonId=Summer+2022&month=06%2F2022&month=Jun%2F2022&display=Display",
"seasonId=700490&seasonId=Summer+2022&month=07%2F2022&month=Jul%2F2022&display=Display",
"seasonId=700490&seasonId=Summer+2022&month=08%2F2022&month=Aug%2F2022&display=Display",
"seasonId=700490&seasonId=Summer+2022&month=09%2F2022&month=Sep%2F2022&display=Display",
"seasonId=700490&seasonId=Summer+2022&month=10%2F2022&month=Oct%2F2022&display=Display",
"seasonId=700882&seasonId=Winter+2022-2023&month=11%2F2022&month=Nov%2F2022&display=Display",
"seasonId=700882&seasonId=Winter+2022-2023&month=12%2F2022&month=Dec%2F2022&display=Display",
"seasonId=700882&seasonId=Winter+2022-2023&month=01%2F2023&month=Jan%2F2023&display=Display",
"seasonId=700882&seasonId=Winter+2022-2023&month=02%2F2023&month=Feb%2F2023&display=Display",
"seasonId=700882&seasonId=Winter+2022-2023&month=03%2F2023&month=Mar%2F2023&display=Display",
"seasonId=700882&seasonId=Winter+2022-2023&month=04%2F2023&month=Apr%2F2023&display=Display",
"seasonId=701280&seasonId=Summer+2023&month=05%2F2023&month=May%2F2023&display=Display",
"seasonId=701280&seasonId=Summer+2023&month=06%2F2023&month=Jun%2F2023&display=Display",
"seasonId=701280&seasonId=Summer+2023&month=07%2F2023&month=Jul%2F2023&display=Display",
"seasonId=701280&seasonId=Summer+2023&month=08%2F2023&month=Aug%2F2023&display=Display",
"seasonId=701280&seasonId=Summer+2023&month=09%2F2023&month=Sep%2F2023&display=Display",
"seasonId=701280&seasonId=Summer+2023&month=10%2F2023&month=Oct%2F2023&display=Display",
"seasonId=702409&seasonId=Winter+2023-2024&month=11%2F2023&month=Nov%2F2023&display=Display",
"seasonId=702409&seasonId=Winter+2023-2024&month=12%2F2023&month=Dec%2F2023&display=Display",
"seasonId=702409&seasonId=Winter+2023-2024&month=01%2F2024&month=Jan%2F2024&display=Display",
"seasonId=702409&seasonId=Winter+2023-2024&month=02%2F2024&month=Feb%2F2024&display=Display",
"seasonId=702409&seasonId=Winter+2023-2024&month=03%2F2024&month=Mar%2F2024&display=Display",
"seasonId=702409&seasonId=Winter+2023-2024&month=04%2F2024&month=Apr%2F2024&display=Display",
"seasonId=702793&seasonId=Summer+2024&month=05%2F2024&month=May%2F2024&display=Display",
"seasonId=702793&seasonId=Summer+2024&month=06%2F2024&month=Jun%2F2024&display=Display",
"seasonId=702793&seasonId=Summer+2024&month=07%2F2024&month=Jul%2F2024&display=Display",
"seasonId=702793&seasonId=Summer+2024&month=08%2F2024&month=Aug%2F2024&display=Display"
)
Ваша проблема заключается в том, что вы указываете длину контента в заголовке, которую вы затем не учитываете в строке контента («Зима 2023-2024 гг.» длиннее, чем «Лето 2023 г.»).
Частично проблема здесь в том, что вы слишком сильно специфицируете запрос, что усложняет его отладку. Вам не нужен первоначальный запрос GET, файлы cookie, пользовательский агент или большинство других заголовков.
Следующее полностью воспроизводится в чистом сеансе.
library(httr)
library(rvest)
headers <- c(`Connection` = "keep-alive",
`Content-Type` = "application/x-www-form-urlencoded",
`Upgrade-Insecure-Requests` = "1")
POST("http://icap.nyiso.com/ucap/public/auc_view_spot_detail.do",
body = paste0("seasonId=702409",
"&seasonId=Winter+2023-2024",
"&month=02%2F2024",
"&month=Feb%2F2024",
"&display=Display"),
add_headers(.headers = headers)) %>%
content(as = "text") %>%
read_html() %>%
html_nodes("table") %>%
getElement(4) %>%
html_table()
#> # A tibble: 45 x 2
#> X1 X2
#> <chr> <chr>
#> 1 "02/2024" "02/2024"
#> 2 "G-J Locality" "G-J Locality"
#> 3 "Awarded Deficiency (MW)" "2,620.8"
#> 4 "Awarded Excess (MW)" "1,748.600"
#> 5 "% Excess Above Requirement" "14.16"
#> 6 "Price ($/kW-M)" "$4.56"
#> 7 "" ""
#> 8 "LI" "LI"
#> 9 "Awarded Deficiency (MW)" "42.8"
#> 10 "Awarded Excess (MW)" "859.700"
#> # i 35 more rows
Вы мужчина, я многому научился из вашего ответа. Помечено как решенное – ура!