Держите выбор прокси в самой операции загрузки. После того как httr вернул страницу, разбирайте байты этого ответа, а не передавайте URL другому загрузчику.

Пусть заданы вектор urls и непустой data frame proxies со столбцами host и целочисленного port:

pages <- vector("list", length(urls))
stopifnot(nrow(proxies) > 0L)

for (i in seq_along(urls)) {
  row <- ((i - 1L) %% nrow(proxies)) + 1L
  response <- httr::GET(
    urls[[i]],
    httr::use_proxy(proxies$host[[row]], proxies$port[[row]]),
    httr::timeout(30)
  )
  httr::stop_for_status(response)
  pages[[i]] <- xml2::read_html(httr::content(response, as = "raw"))
}

Для запросов к публичным страницам, разрешённым через публичных посредников, список HTTP-прокси поставляет кандидатов для столбцов host и port. Индекс проходит от первой строки прокси до последней и возвращается к началу. У каждого вызова своя конфигурация прокси; процесс R может продолжать работу.

Полученные страницы содержат разобранные документы HTML. Применяйте к ним rvest::html_elements и нужные функции извлечения. Передача URL в read_html вместо этого запустила бы новую загрузку с собственной сетевой конфигурацией этого пути.

Для прокси с аутентификацией передавайте выбранную учётную запись через аргументы username и password функции use_proxy. Другая конечная точка не гарантирует другой публичный выходной IP, поэтому пул выбирайте по реальному поведению сервиса на выходе.

Похожие статьи