У меня есть веб-страница (https://deos.udel.edu/data/daily_retrieval.php), из которой я хочу извлечь данные. Однако эти данные представляют собой данные об осадках, относящиеся к конкретному выбору, сделанному на веб-странице. Конкретные варианты выбора включают станцию и дату. Я использую пакет R rvest
и не уверен, можно ли выполнить этот запрос данных в R с помощью rvest
. Некоторые фрагменты исходного кода, представляющие интерес для веб-страницы, можно найти ниже.
<label class = "retsection" for = "station">Station:</label><br>
<select class = "statlist" name = "station" id = "station" size = "10">
<option class = "select_input" value = "DTBR" selected>Adamsville, DE-Taber</option>
<option class = "select_input" value = "DBUR">Angola, DE-Burton Pond</option>
<option class = "select_input" value = "DWHW">Atglen, PA-Wolfs Hollow</option>
<option class = "select_input" value = "DBBB">Bethany Beach, DE-Boardwalk</option>
<option class = "select_input" value = "DBNG">Bethany Beach, DE-NGTS</option>
<option class = "select_input" value = "DBKB">Blackbird, DE-NERR</option>
<option class = "select_input" value = "DBRG">Bridgeville, DE</option>
<label class = "retsection">Date:<br> </label>
<select name='month' size='6' length='10'>
<option value='1'>January</option>
<option value='2'>February</option>
<option value='3'>March</option>
<option value='4'>April</option>
<option value='5'>May</option>
<option value='6'>June</option>
<option value='7'>July</option>
<option value='8' selected>August</option>
<option value='9'>September</option>
<option value='10'>October</option>
<option value='11'>November</option>
<option value='12'>December</option>
</select>
<select name='day' size='6' length='4'>
<option value='1'>1</option>
<option value='2' selected>2</option>
<option value='3'>3</option>
<option value='4'>4</option>
<option value='5'>5</option>
<option value='6'>6</option>
Моя первоначальная мысль заключалась в том, что эту задачу невозможно выполнить, поскольку данные об осадках не отображаются активно на веб-странице... данные всплывают в отдельном окне после того, как выбор сделан. У меня есть ключ доступа, предоставленный веб-страницей, но я не уверен на 100%, можно ли его использовать для получения большого набора данных, который я хочу получить.
rvest
?Спасибо.
Меня интересуют ежедневные значения осадков на станции Смирна, DE-DASEF за несколько лет (2020, 2021, 2022, 2023). Таким образом, я могу присоединиться к дождям, которые произошли за день до отбора пробы качества воды, взятой из той же географической области. Осадки, предшествующие отбору проб, напрямую влияют на определенные параметры. Я хочу автоматизировать этот процесс анализа, чтобы иметь возможность выполнять репликацию между станциями и не тратить много часов на сбор данных об отдельных событиях дождя.
Этот пакет предназначен для статического парсинга HTML. но данные об осадках отображаются в отдельном окне или загружаются динамически в зависимости от выбора пользователя. Поэтому вам придется использовать другой подход.
library(httr)
library(jsonlite)
url <- "https://example.com/api"
params <- list(station = "DTBR", month = 8, day = 2)
response <- GET(url, query = params)
data <- content(response, "parsed")
Чтобы получить диапазон данных об осадках без вызова каждого дня по отдельности, вы можете просмотреть желаемый диапазон дат и сделать запросы программно.
library(httr)
library(lubridate)
library(dplyr)
url <- "https://www.deos.udel.edu/odd-divas/station_daily.php?network=DEOS"
station <- "DSMY"
start_date <- as.Date("2024-07-01")
end_date <- as.Date("2024-07-31")
all_data <- list()
for (date in seq.Date(start_date, end_date, by = "day")) {
day <- day(date)
month <- month(date)
year <- year(date)
params <- list(station = station, month = month, day = day, year = year)
response <- GET(url, query = params)
if (status_code(response) == 200) {
data <- content(response, as = "text")
all_data[[as.character(date)]] <- data
} else {
message(paste("Failed to retrieve data for", date))
}
}
print(all_data)
Это предложение позволяет получить данные об осадках за один день для интересующей станции. Используемый код следующий: url<-"https://www.deos.udel.edu/odd-divas/station_daily.php?network=DEOS" params<-list(station = "DSMY", month = 7, day = 2, year = 2024) response<-GET(url, query = params) data<-content(response, as = "text")
Есть какие-нибудь предложения о том, как я могу получить диапазон данных, не вызывая каждый день в качестве отдельного параметра? Исходная веб-страница не поддерживает получение ряда данных.
немного попахивает ChatGPT
кроме того, ваш код на самом деле не запускается, я получаю сообщение об ошибке: «Ошибка в месяце.число(дата): значения не в 1:12. Кроме того: предупреждающее сообщение: tz(): не знаю, как вычислить часовой пояс для объект числового класса, возвращающий «UTC».»
У меня такие же ошибки Error in month.numeric(date) : Values are not in 1:12 In addition: Warning message: tz(): Don't know how to compute timezone for object of class numeric; returning "UTC".
Вероятно, вам не нужно это использовать. У DEOS есть способы загрузки исторических данных в формате CSV. Кроме того, убедитесь, что при очистке сайта вы оставляете некоторое время между каждым запросом, иначе вы будете раздражать владельцев, и они, скорее всего, заблокируют вас или замедлят ваши ответы.
Хитрость в том, что параметры включены в URL-адрес. Поэтому нам нужно только настроить их, чтобы получить новый результат, как показано ниже:
pacman::p_load(glue, rvest) # glue makes adding parameters to a string easier/cleaner
url <- "https://deos.udel.edu/odd-divas/station_daily.php?network = {network}&station = {station}&month = {m}&day = {d}&year = {y}"
network <- "DEOS"
station <- "DTBR"
m <- 8
d <- 3
y <- 2024
url <- glue(url)
glue(url) |>
read_html() |>
html_table()
Выход:
[[1]]
# A tibble: 3 × 4
X1 X2 X3 X4
<chr> <chr> <chr> <chr>
1 ID DTBR Network DEOS
2 City/State Adamsville/DE Elevation 51 ft.
3 Latitude 38° 52' N Longitude 75° 42' W
[[2]]
# A tibble: 24 × 20
Hour Temp \…¹ Temp …² Dew Point …³
<int> <dbl> <dbl> <dbl>
1 0 77.2 25.1 73.7
2 1 76.7 24.8 74
3 2 77.1 25 72.2
4 3 76.8 24.9 71.5
5 4 76 24.5 72.3
6 5 75.3 24.1 71.9
7 6 74.8 23.8 72.2
8 7 76.3 24.6 73.4
9 8 79.2 26.2 74.4
10 9 82.6 28.1 74.6
# ℹ 14 more rows
# ℹ abbreviated names: ¹`Temp \n(°F)`,
# ²`Temp \n(°C)`, ³`Dew Point \n(°F)`
# ℹ 16 more variables: `Dew Point \n(°C)` <dbl>,
# `Rel Hum. \n(%)` <int>,
# `Wind Spd. \n(MPH)` <dbl>,
# `Wind Spd. \n(m/s)` <dbl>, …
# ℹ Use `print(n = ...)` to see more rows
[[3]]
# A tibble: 1 × 11
High Temp. \n…¹ Low Temp. …² Avg. Temp. …³
<dbl> <dbl> <dbl>
1 88.7 71.1 80.1
# ℹ abbreviated names: ¹`High Temp. \n(°F)`,
# ²`Low Temp. \n(°F)`, ³`Avg. Temp. \n(°F)`
# ℹ 8 more variables: `Avg. Dew Point \n(°F)` <dbl>,
# `Avg. Rel Hum \n(%)` <int>,
# `Avg. Wind Spd \n(MPH)` <dbl>,
# `Avg. Wind Dir \n(°)` <chr>,
# `Peak Gust \n(MPH)` <dbl>, …
[[4]]
# A tibble: 1 × 1
X1
<chr>
1 Note: All observations were obtained from the Delaware Environmental Observin…
[[5]]
# A tibble: 3 × 1
X1
<chr>
1 "Copyright © 2004-2024 DEOS"
2 "Please read the Data Disclaimer\n before using any data."
3 "Questions or comments about this page? Click here\n."
Чтобы расширить это число до нескольких дней, вы можете использовать цикл for или map()
или любое количество других функций, которые делают примерно то же самое. Но не зная наверняка, какую информацию вы хотите получить на этом сайте, я бы сказал, что весьма вероятно, что вы можете получить ее от них другими способами.
Я наткнулся на историческую функцию загрузки CSV, созданную DEOS. Эта встроенная функция позволяет вам экспортировать данные за один день или сумму общих данных об осадках за месяц, но она позволяет вам экспортировать данные об осадках за несколько дней в течение года. Меня интересуют ежедневные значения осадков на станции Смирна, DE-DASEF за несколько лет (2020, 2021, 2022, 2023). Таким образом, я могу присоединиться к дождям, которые произошли за день до отбора пробы качества воды, взятой из той же географической области. Осадки, предшествующие отбору проб, напрямую влияют на определенные параметры.
Я предполагаю, что вы имели в виду «но это не позволяет вам экспортировать данные об осадках за несколько дней в течение года»?
Правильный. Я хотел сказать, что он не позволяет пользователю экспортировать данные об осадках за несколько дней в течение года. Извините за опечатку.
ОК, при дальнейшем рассмотрении выяснилось, что они, к сожалению, на самом деле не обеспечивают экспорт данных для ежедневных данных. Существует возможность использовать их бэкэнд JSON (например, ares.deos.udel.edu/almanac/…), но по-прежнему есть вариант только одного дня или агрегированных результатов.
Проблема в том, что они выполняют запросы на стороне сервера, а это означает, что мы не можем получить доступ ко всем данным на нашей стороне.
Спасибо за этот комментарий. Я уже вступил в обсуждение с владельцем/хостом веб-сайта моих потребностей в данных. Надеюсь, они либо предоставят мне более крупные наборы данных, либо мы сможем работать над решением, при котором пользователи смогут извлекать данные непосредственно в R или SAS.
Какие именно данные вам нужны?