2011-07-18 2 views
4

Есть ли способ сообщить R или пакет RCurl отказаться от попытки загрузить веб-страницу, если она превышает указанный период времени и перейти на следующую строку кода? Например:Как остановить выполнение RCurl :: getURL(), если он занимает слишком много времени?

> library(RCurl) 
> u = "http://photos.prnewswire.com/prnh/20110713/NY34814-b" 
> getURL(u, followLocation = TRUE) 
> print("next line") # programme does not get this far 

Это будет просто висеть на моей системе и не перейти к последней строке.

EDIT: Основываясь на нижеследующем ответе @Richie Cotton, хотя я могу «как-то» достичь того, чего хочу, я не понимаю, почему это занимает больше времени, чем ожидалось. Например, если я делаю следующее, система зависает, пока я не выбрать/отменить выбор «Буферизированный Разное >> Output '» в RGUI:

> system.time(getURL(u, followLocation = TRUE, .opts = list(timeout = 1))) 
Error in curlPerform(curl = curl, .opts = opts, .encoding = .encoding) : 
    Operation timed out after 1000 milliseconds with 0 out of 0 bytes received 
Timing stopped at: 0.02 0.08 ***6.76*** 

РЕШЕНИЕ: на основе @ пост Дункана ниже, а затем впоследствии иметь взгляд на локоны документов, я нашел решение, используя опцию maxredirs следующим образом:

> getURL(u, followLocation = TRUE, .opts = list(timeout = 1, maxredirs = 2, verbose = TRUE)) 

Спасибо любезно,

Тони Breyal

O/S: Windows 7 
R version 2.13.0 (2011-04-13) Platform: x86_64-pc-mingw32/x64 (64-bit) 
attached base packages: 
[1] stats  graphics grDevices utils  
datasets methods base  
other attached packages: 
[1] RCurl_1.6-4.1 bitops_1.0-4.1 
loaded via a namespace (and not attached): 
[1] tools_2.13.0 

ответ

5

Я считаю, что веб-сервер получает себя в запутанном состоянии, сообщая нам, что URL временно переехал, а затем он указывает нам на новый URL

http://photos.prnewswire.com/medias/switch.do?prefix=/appnb&page=/getStoryRemapDetails.do&prnid=20110713%252fN \ Y34814% 252db & action = details

Когда мы следуем за этим, он перенаправляет нас еще раз .... тот же URL !!!

Таким образом, тайм-аут не является проблемой. Ответ приходит очень быстро, поэтому продолжительность таймаута не превышает. Это тот факт, что мы кружаемся по кругу, что вызывает видимое зависание.

Способ, которым я нашел это, добавив verbose = TRUE в список .opts Затем мы видим все сообщение между нами и сервером.

D.

4

timeout и connecttimeout являются локон варианты, поэтому они должны быть переданы в виде списка в .opts для getURL параметра Я. Не уверен, какой из этих двух, что вам нужно, но начинать с

getURL(u, followLocation = TRUE, .opts = list(timeout = 3)) 

EDIT:

я могу воспроизвести зависания; изменение буферизованного вывода не исправляет его для меня (проверено в R2.13.0 и R2.13.1), и это происходит с аргументом таймаута или без него. Если вы попробуете getURL на странице, заданной для перенаправления, он выглядит пустым.

u2 <- "http://photos.prnewswire.com/medias/switch.do?prefix=/appnb&page=/getStoryRemapDetails.do&prnid=20110713%252fNY34814%252db&action=details" 
getURL(u2) 

Если удалить page аргумент, он перенаправляет вас на страницу входа в систему; возможно, PR Newswire делает что-то смешное с просьбой предоставить учетные данные.

u3 <- "http://photos.prnewswire.com/medias/switch.do?prefix=/appnb&prnid=20110713%252fNY34814%252db&action=details" 
getURL(u3) 
+0

Приветствия дружище, что лучше, но я до сих пор не совсем получить то, что мне нужно (см редактировать в Q) –

+0

Я послал по электронной почте пакет сопровождающего, чтобы дать ему знать об этой проблеме. –

Смежные вопросы