Рекомендация при использовании Sys.sleep () в R с rvest - PullRequest
0 голосов
/ 13 октября 2018

Я очищаю тысячи веб-страниц, используя пакет R rvest.Чтобы не перегружать сервер, я синхронизировал функцию Sys.sleep() с 5 секундами.

Она работает хорошо, пока мы не достигнем значения ~ 400 очищенных веб-страниц.Однако, кроме этого значения, я ничего не получаю, и все данные пусты, хотя ошибка не выдается.

Мне интересно, есть ли возможность изменить функцию Sys.sleep() для очистки 350 веб-страниц по 5 секунд каждая, затем ждать, например, 5 минут, затем продолжить еще 350 веб-страниц ... и так далее.

Я проверял документацию по функции Sys.sleep(), и только time появляется в качестве аргумента.Итак, если это невозможно сделать с помощью этой функции, есть ли другая возможность или функция для решения этой проблемы при очистке огромного количества страниц?

ОБНОВЛЕНИЕ С ПРИМЕРОМ

Это часть моего кода.Объект links состоит из более 8 тысяч ссылок.

title <- vector("character", length = length(links))
short_description <- vector("character", length = length(links))

for(i in seq_along(links)){
  Sys.sleep(5)
  aff_link <- read_html(links[i])
  title[i] <- aff_link %>%
    html_nodes("title") %>% 
    html_text()
  short_description[i] <- aff_link %>%
    html_nodes(".clp-lead__headline") %>% 
    html_text()
}

1 Ответ

0 голосов
/ 13 октября 2018

Вы можете добавить проверку модуля переменной цикла и делать дополнительный сон каждые N итераций.Пример:

> for(i in 1:100){
  message("Getting page ",i)
  Sys.sleep(5)
  if((i %% 10) == 0){
    message("taking a break")
    Sys.sleep(10)
  }
 }

Каждые 10 итераций выражение i %% 10 равно TRUE, и вы получаете дополнительный 10-секундный сон.

Я могу придумать более сложные решения, но это может сработать дляВы.

Еще одна возможность - проверить, возвращает ли страница какие-либо данные, и, если нет, поспать вдвое дольше и повторить попытку, повторяя это несколько раз.Вот некоторый полупсевдокод:

get_page = function(page){
   sleep = 5
   for(try in 1:5){
     html = get_content(page)
     if(download_okay(html)){
      return(html)
     }
     sleep = sleep * 2
     Sys.sleep(sleep)
    }
    return("I tried - but I failed!")
}

Некоторые средства получения веб-страниц, такие как CURL, будут делать это автоматически с правильными параметрами - возможно, есть способ запутать это и в вашем коде.

...