Как исправить проблему с таймаутом в curl::curl_fetch_memory при использовании R с прокси-сервером?

#r #curl #proxy #quantmod

Вопрос:

Я видел много вопросов по curl проблеме тайм-аута. Однако я все еще в замешательстве по поводу своего дела.

Моя проблема возникла, когда я использовал quantmod::getSymbols . Каждое испытание заканчивалось

 Warning message:
x = 'AAPL', get = 'stock.prices': Error in curl::curl_fetch_memory(cu, handle = h): Timeout was reached: [finance.yahoo.com] Operation timed out after 10008 milliseconds with 0 out of 0 bytes received
 

Обратите внимание, что я использую прокси-сервер. Я пытался включать и выключать прокси-сервер или запускать

 httr::set_config(httr::use_proxy(
  "127.0.0.1:xxxxxx", port = 8080,
  username = "xxxx", password = "****"
), override = TRUE)
 

Однако ничего не работает.

После того, как я запутался во quantmod внутренних деталях, я решил поэкспериментировать в чистом curl_fetch_memory виде .

  1. пример в curl_fetch_memory документе нормально работает на моем компьютере
 curl::curl_fetch_memory("http://httpbin.org/cookies/set?foo=123amp;bar=ftw")
 
  1. curl_fetch_memory не работает "https://finance.yahoo.com/" (Обратите внимание, что я не могу получить доступ к веб-сайту в веб-браузере без моего прокси)
  2. Следующие коды могут успешно извлекать результаты из https://finance.yahoo.com/:
 curl_opts <- list(
  ssl_verifypeer = 0L,
  proxyuserpwd = "xxxx:****",
  proxyauth = as.integer(15),
  proxy = "127.0.0.1:xxxxxx",
  proxyport = 8080
)
cookie_handler <- curl::new_handle()
curl::handle_setopt(handle=cookie_handler, .list=curl_opts)

curl::curl_fetch_memory("https://finance.yahoo.com/",
                        handle = cookie_handler)
 

Похоже, что quantmod не удается правильно использовать настройки прокси-сервера. Однако нет возможности установить прокси-сервер внутри функций из пакета. Как я могу решить свою проблему?

Система:

 R version 4.1.1 (2021-08-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19043)

Matrix products: default

locale:
[1] LC_COLLATE=Chinese (Simplified)_China.936 
[2] LC_CTYPE=Chinese (Simplified)_China.936   
[3] LC_MONETARY=Chinese (Simplified)_China.936
[4] LC_NUMERIC=C                              
[5] LC_TIME=Chinese (Simplified)_China.936   

# ...
 

Ответ №1:

Я думаю, что нашел решение. Все, что вам нужно, это включить прокси-сервер и запустить

 Sys.setenv(ALL_PROXY = "YOUR_PROXY_HOST")
 

до запроса.

Однако в настоящее время я все еще понятия не имею, как curl используется эта настройка ALL_PROXY . Я был бы признателен, если бы кто-нибудь мог дать этому объяснение.