один узел выдал ошибку: истек тайм-аут: [www.website.com ] Время ожидания соединения истекло через 10001 миллисекунду

#r #web-scraping #parallel-processing #screen-scraping #rvest

#r #очистка веб-страниц #параллельная обработка #очистка экрана #rvest

Вопрос:

Я пытаюсь выполнить очистку веб-страниц с помощью следующего кода и сталкиваюсь с ошибкой.

 table_desc<-function(links){descriptions<-read_html(link_to_stats_tables[links])%>%html_nodes("[class='content-footer']")%>%html_nodes('p')%>%html_text()}

cores=detectCores()
cl <- makeCluster(cores)
clusterExport(cl,c("%>%","read_html","html_nodes","html_table","html_text","table_desc"))
system.time(alltables<-parLapply(cl,1:length(link_to_stats_tables),table_desc))
stopCluster(cl)
  

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

 Error in checkForRemoteErrors(val) : 
  one node produced an error: Timeout was reached: [www.website.com] Connection timed out after 10001 milliseconds
Timing stopped at: 0.09 0.14 4124
  

Кто-нибудь может мне помочь с этим, пожалуйста?

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

1. вам не хватает brackt ( } ) в конце функции. куда это должно идти? Alos добавляет все неосновные пакеты, которые это использует. Кроме того, должна ли stopCkuster строка появляться после создания объекта cl? Вам нужно немного поработать, чтобы сделать этот пример воспроизводимым

2. Я бы также рекомендовал clusterEvalQ(cl, { library(dplyr); library(xml2); }) (и любые другие библиотеки) вместо отдельных объектов, поскольку многие функции имеют внутренние требования в пакете.

3. @RAB Я выполнил все те действия, о которых вы упомянули. Я просто перепутал копирование его из моей R env. Я исправил эту опечатку здесь. Но проблема в том, что он функционирует нормально, пока я не начну перебирать большее количество URL-ссылок. Это работает даже в течение 2000 итераций, но не более того. Мне нужно просмотреть более 17000 ссылок.

4. @r2evans Я не уверен, как создать воспроизводимый код здесь, потому что код работает для небольшого количества ссылок. Когда я пытаюсь реализовать это в большем масштабе, он выдает эту ошибку. Я предполагаю, что владелец веб-сайта ограничивает мою итерацию или что-то в этомроде. Нужно ли переводить мою систему в спящий режим на определенное время? нравится использовать sys.sleep()?

5. Во-первых, я думаю, что параллельная загрузка одного веб-сайта с максимально возможной скоростью пойдет вам на пользу, но может привести к тому, что они ограничат ваши подключения. Поскольку вы используете read_html , это говорит о том, что у них нет официальной документации API, но указывают ли их условия использования на попытки подключения? Я знаю, что если я обнаружу, что мой веб-сайт быстро отключается, я временно забаню IP и надеюсь, что воспринимаемый скрипт-кидди потеряет интерес.