Извлечение данных с веб-страницы с параметрами выбора

У меня есть веб-страница (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%, можно ли его использовать для получения большого набора данных, который я хочу получить.

  1. Возможен ли этот тип запроса данных с помощью rvest?
  2. Какие методы могут быть предложены для извлечения больших объемов данных через R. Например, данные об осадках за годы для конкретной интересующей станции.

Спасибо.

Какие именно данные вам нужны?

Mark 04.08.2024 13:37

Меня интересуют ежедневные значения осадков на станции Смирна, DE-DASEF за несколько лет (2020, 2021, 2022, 2023). Таким образом, я могу присоединиться к дождям, которые произошли за день до отбора пробы качества воды, взятой из той же географической области. Осадки, предшествующие отбору проб, напрямую влияют на определенные параметры. Я хочу автоматизировать этот процесс анализа, чтобы иметь возможность выполнять репликацию между станциями и не тратить много часов на сбор данных об отдельных событиях дождя.

Josh B 05.08.2024 03:06
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
2
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Этот пакет предназначен для статического парсинга HTML. но данные об осадках отображаются в отдельном окне или загружаются динамически в зависимости от выбора пользователя. Поэтому вам придется использовать другой подход.

  • Используйте инструменты разработчика браузера для проверки сетевых запросов, выполняемых при выборе станции и даты. Найдите запрос, который получает данные об осадках. Это может быть конечная точка API или отправка формы, которую вы можете реплицировать в R.
  • Если вы найдете конкретный URL-адрес, который извлекает данные, вы можете использовать пакет httr в R для выполнения запросов GET. Это позволяет программно указать параметры для получения желаемых данных.
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") Есть какие-нибудь предложения о том, как я могу получить диапазон данных, не вызывая каждый день в качестве отдельного параметра? Исходная веб-страница не поддерживает получение ряда данных.

Josh B 03.08.2024 06:18

немного попахивает ChatGPT

Mark 04.08.2024 13:20

кроме того, ваш код на самом деле не запускается, я получаю сообщение об ошибке: «Ошибка в месяце.число(дата): значения не в 1:12. Кроме того: предупреждающее сообщение: tz(): не знаю, как вычислить часовой пояс для объект числового класса, возвращающий «UTC».»

Mark 04.08.2024 13:24

У меня такие же ошибки 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".

Josh B 05.08.2024 02:20
Ответ принят как подходящий

Отказ от ответственности:

Вероятно, вам не нужно это использовать. У 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). Таким образом, я могу присоединиться к дождям, которые произошли за день до отбора пробы качества воды, взятой из той же географической области. Осадки, предшествующие отбору проб, напрямую влияют на определенные параметры.

Josh B 05.08.2024 03:00

Я предполагаю, что вы имели в виду «но это не позволяет вам экспортировать данные об осадках за несколько дней в течение года»?

Mark 05.08.2024 03:18

Правильный. Я хотел сказать, что он не позволяет пользователю экспортировать данные об осадках за несколько дней в течение года. Извините за опечатку.

Josh B 05.08.2024 03:26

ОК, при дальнейшем рассмотрении выяснилось, что они, к сожалению, на самом деле не обеспечивают экспорт данных для ежедневных данных. Существует возможность использовать их бэкэнд JSON (например, ares.deos.udel.edu/almanac/…), но по-прежнему есть вариант только одного дня или агрегированных результатов.

Mark 05.08.2024 03:37

Проблема в том, что они выполняют запросы на стороне сервера, а это означает, что мы не можем получить доступ ко всем данным на нашей стороне.

Mark 05.08.2024 03:40

Спасибо за этот комментарий. Я уже вступил в обсуждение с владельцем/хостом веб-сайта моих потребностей в данных. Надеюсь, они либо предоставят мне более крупные наборы данных, либо мы сможем работать над решением, при котором пользователи смогут извлекать данные непосредственно в R или SAS.

Josh B 05.08.2024 03:42

Другие вопросы по теме