使用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
相关产品推荐
相关产品推荐

