【问题标题】:Redirect GET to HTTPS, if necessary如有必要,将 GET 重定向到 HTTPS
【发布时间】:2025-11-29 22:05:01
【问题描述】:

当我尝试使用 HTTP 协议下载 URL 时,我收到 400 错误:

library(httr)
x1 <- "http://www.sonnenwende-harsewinkel.de/öko-gas/bürgerwerke/"
resp <- httr::GET(x1, httr::timeout(60))
resp[["status_code"]]
#400

切换到HTTPS协议后问题解决:

x2 <- "https://www.sonnenwende-harsewinkel.de/öko-gas/bürgerwerke/"
resp <- httr::GET(x2, httr::timeout(60))
resp[["status_code"]]
#200

当我在网络浏览器中输入 HTTP 地址时,我会被重定向到 HTTPS 地址。是否也可以使用httr 进行重定向?

【问题讨论】:

标签: r web-scraping httr


【解决方案1】:

CORS Anywhere API 就是为此目的而设计的。将 https://cors-anywhere.herokuapp.com/ 添加到您的 url,然后运行请求。它可能需要更长的时间,因为它通过另一台服务器运行,但它会处理 https 问题。这是您在任何地方使用 cors 的示例。

library(httr)

# combine cors-anywhere url and user url
cors <- "https://cors-anywhere.herokuapp.com/"
url <- "http://www.sonnenwende-harsewinkel.de/oko-gas/burgerwerke/"
request <- paste0(cors, url)

# run request
response <- GET(request, add_headers("X-Requested-With" = "XmlHttpRequest"))
content(response, "text", encoding = "utf-8")

【讨论】:

【解决方案2】:

如果您获得 http 400,为什么不直接在 URL 中添加 s

rGET <- function(url, ...)
{
  res <- httr::GET(url, ...)
  if(res$status_code == 400) 
    return(httr::GET(gsub("http://", "https://", url), ...))
  else
    return(res)
}

所以你可以这样做

rGET("http://www.sonnenwende-harsewinkel.de/öko-gas/bürgerwerke/")
#> Response [https://www.sonnenwende-harsewinkel.de/öko-gas/bürgerwerke/]
#>   Date: 2020-04-30 20:59
#>   Status: 200
#>   Content-Type: text/html; charset=UTF-8
#>   Size: 51.7 kB
#> <!DOCTYPE html>
#> <html lang="de-DE"><head>
#>     <meta charset="utf-8"/>
#> <link rel="dns-prefetch preconnect" href="https://u.jimcdn.com/" crossorigin="a...
#> <link rel="dns-prefetch preconnect" href="https://assets.jimstatic.com/" crosso...
#> <link rel="dns-prefetch preconnect" href="https://image.jimcdn.com" crossorigin...
#> <link rel="dns-prefetch preconnect" href="https://fonts.jimstatic.com" crossori...
#> <link rel="dns-prefetch preconnect" href="https://www.google-analytics.com" cro...
#> <meta name="viewport" content="width=device-width, initial-scale=1"/>
#> <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
#> ...

【讨论】:

  • 谢谢,这是个好主意。但是,如果可能的话,我想避免第二次 GET,或者只在真正的问题时才想进行第二次 GET。
  • @KarstenW。如果第一个失败,它只会执行第二个 GET
最近更新 更多