You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用httr发送POST请求抓取Investing.com历史数据未返回目标表格

问题定位

Investing.com的HistoricalDataAjax接口设置了请求来源校验规则,当前脚本仅传递了请求体参数,缺少必要的请求头配置,被服务器识别为非法非浏览器请求,因此不会返回目标历史数据,只会返回通用页面内容,解析后自然得到无关表格。

修复方案

需要对脚本做三处调整:

  • 新增必要请求头:添加Referer(值为对应标的的历史数据页面地址)、User-Agent(模拟正常浏览器标识)、X-Requested-With(标识为AJAX异步请求)三类请求头,绕过反爬校验
  • 显式指定请求编码:POST请求指定encode = "form",符合接口的表单参数接收规则
  • 修正请求体参数:不需要手动将header参数内的空格替换为加号,httr会自动完成参数编码,手动替换反而会导致参数识别失败
修改后完整代码
library(httr)
library(rvest)

# 历史数据接口地址
url <- 'https://www.investing.com/instruments/HistoricalDataAjax'

# 配置请求头
request_headers <- c(
  "Referer" = "https://www.investing.com/rates-bonds/austria-1-year-bond-yield-historical-data",
  "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
  "X-Requested-With" = "XMLHttpRequest"
)

# 发送POST请求
http_resp <- POST(
  url = url,
  add_headers(.headers = request_headers),
  body = list(
    curr_id = "23859", 
    smlID = "202274", 
    header = "Austria 1-Year Bond Yield Historical Data",
    st_date = "08/01/2021", # 日期格式为月/日/年
    end_date = "08/20/2021",
    interval_sec = "Daily",
    sort_col = "date",
    sort_ord = "DESC",
    action = "historical_data"
  ),
  encode = "form"
)

# 解析并提取表格
html_doc <- read_html(http_resp)
target_table <- html_table(html_doc, fill = TRUE)[[1]]
print(target_table)
补充说明

如果运行后仍未返回正确数据,可更新User-Agent为你本地浏览器的实际标识,或核对curr_id、smlID两个参数是否与当前页面的最新参数一致,网站可能会定期更新标的ID值。

内容的提问来源于stack exchange,提问作者Artem Kochnev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 05:18:03