Очистка веб-страниц с использованием списка URL-адресов в R

#r #url #screen-scraping

#r #url #очистка экрана

Вопрос:

Я пытаюсь очистить некоторые URL-адреса с нескольких веб-сайтов, которые я собрал. Я сохранил уже собранные веб-сайты в фрейме данных с именем meetings2017_2018 . Проблема в том, что URL-адреса не очень похожи друг на друга, за исключением первой части URL-адресов: https://amsterdam.raadsinformatie.nl . Вторая часть URL-адресов сохраняется во фрейме данных. Вот несколько примеров:

/vergadering/458873/raadscommissie Algemene Zaken
/vergadering/458888/raadscommissie Wonen
/vergadering/458866/raadscommissie Jeugd en Cultuur
/vergadering/346691/raadscommissie Algemene Zaken

Таким образом, весь URL-адрес будет https://amsterdam.raadsinformatie.nl/vergadering/458873/raadscommissie Algemene Zaken

Мне удалось создать очень простую функцию, с помощью которой я могу извлекать URL-адреса с одного веб-сайта (см. Ниже).

 web_scrape <- function(meeting) {
      url <-  glue("https://amsterdam.raadsinformatie.nl{meeting}")
      read_html(url) %>%
      html_nodes("a") %>%
      html_attr("href")
      }
  

С помощью этой функции мне все еще нужно вставить каждый отдельный URL-адрес из фрейма данных, который я хочу очистить. Поскольку во фрейме данных более 140, это может занять некоторое время. Как вы можете догадаться, я хочу очистить все URL-адреса сразу, используя список URL-адресов во фрейме данных. Кто-нибудь знает, как я могу это сделать?

Комментарии:

1. Привет! Вы можете сопоставить / выполнить итерацию по всем вашим URL-адресам, сохраненным в meetings2017_2018 фрейме данных. Вы знаете, как это сделать, или хотите получить какое-то руководство?

2. и… Правильно ли я понимаю: я собираю много URL-адресов с помощью вашей функции web_scrape . И после этого вы хотите перейти к каждому из этих URL-адресов и извлечь из него некоторую информацию, верно?

3. Да, это правильно. Я написал простой код фильтра для URL-адресов, которые собираются после правильной работы функции, но я подумал, что для этого вопроса это не имеет значения. Я не уверен, как сопоставить / выполнить итерацию. Я попытался использовать функцию map таким образом map(meetings2017_2018, web_scrape)

Ответ №1:

Вы могли бы сопоставить / повторить сохраненный URL-адрес в meetings2017_2018 фрейме данных:

Предполагая, что ваши URL-адреса сохранены в url столбце вашего meetings2017_2018 фрейма данных, отправной точкой будет:

 # create a vector of the URLs
urls <- pull(meetings2017_2018, url)

# map over the URLs and execute whatever code you want for every URL
map(urls, function(url) {
    your_code
})
  

Комментарии:

1.Я попробовал следующее, но я получил сообщения об ошибках, говорящие Error in open.connection(x, "rb") : HTTP error 400. urls <- pull(meetings2017_2018, urls) map(urls, function(url) { url <- glue("https://amsterdam.raadsinformatie.nl{url}") read_html(url) %>% html_nodes("a") %>% html_attr("href") })

2. это сработало. В URL-адресах было несколько пробелов, из-за чего я получил сообщение об ошибке. Спасибо за вашу помощь! Единственное, что мне нужно сделать сейчас, это отменить проверку фрейма данных

3. У меня есть еще один вопрос. Я думал, что будет легко отменить вывод, но, похоже, я и здесь застрял. На выходе получается большой список из 145 элементов (для каждого веб-сайта, который был очищен). Каждый элемент имеет разное количество строк (между 90-300), но у всех есть один столбец с именем X[[i]]. Знаете ли вы, что я могу сделать это одним большим фреймом данных с двумя столбцами: (1) номером элемента и (2) информацией о строке?

4. Вы должны создать минимально воспроизводимый пример и опубликовать новый вопрос.