使用httr::GET请求Oddsportal数据的编码解码问题求助
解决提示
1. 补全Base64/Base64URL的填充字符
Base64和Base64URL编码要求字符串长度为4的倍数,缺失的部分需要用=补全。先检查返回字符串的长度,计算需补充的=数量:
- 长度模4余1:补3个
= - 长度模4余2:补2个
= - 长度模4余3:补1个
=
以你提供的示例字符串为例,长度为50,50%4=2,补2个=后得到完整串:
encoded_str <- "ZDRCVTcxaklMRU5DRHRyeXdPRzdUbnhsWm44MFpZTkVWaWI1am=="
2. 执行Base64URL转标准Base64并解码
如果是Base64URL编码,需先替换特殊字符再用标准Base64解码:
library(base64enc) # 转换Base64URL到标准Base64格式 base64_str <- gsub("-", "+", gsub("_", "/", encoded_str)) # 解码为原始字节 decoded_raw <- base64decode(base64_str) # 尝试转为文本 decoded_text <- rawToChar(decoded_raw)
3. 检查是否存在数据压缩
如果解码后仍是乱码,大概率数据被压缩(如gzip、deflate),尝试解压:
# 尝试gzip解压 tryCatch({ decompressed <- memDecompress(decoded_raw, type = "gzip") cat(rawToChar(decompressed)) }, error = function(e) { # 尝试deflate解压 tryCatch({ decompressed <- memDecompress(decoded_raw, type = "deflate") cat(rawToChar(decompressed)) }, error = function(e) { cat("解压失败,数据可能不是gzip/deflate压缩格式") }) })
4. 优化请求头参数
部分接口会根据请求头返回不同编码的数据,确保httr::GET模拟浏览器请求:
library(httr) response <- GET( "你的目标Ajax URL", add_headers( "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", "Accept" = "application/json, text/javascript, */*; q=0.01", "Accept-Encoding" = "gzip, deflate, br" ) ) # 用httr内置函数自动处理编码与解压 content(response, "text")
注意:httr::content会自动识别并处理压缩编码,优先使用该函数直接获取内容,比手动解码更可靠。
内容的提问来源于stack exchange,提问作者M.O
相关产品推荐
相关产品推荐

