#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 и надеюсь, что воспринимаемый скрипт-кидди потеряет интерес.