已传递Token至请求头,但使用httr和rvest抓取XHR数据失败
使用httr/rvest抓取Barchart XHR数据无输出的解决办法
问题排查与修复要点
- XSRF-TOKEN提取优化:原代码用
dplyr::recode的方式绕了弯路,直接从会话cookie中筛选目标字段更可靠。 - 完整Cookie传递:仅在请求头加XSRF-TOKEN不够,服务器需要会话中的所有关联Cookie验证身份,必须将会话的Cookie集合传递给请求。
- 响应内容解析:确保正确处理gzip压缩的响应,直接解析为JSON格式更高效。
修正后的代码
library(httr) library(rvest) library(dplyr) # 建立会话并获取完整Cookie s <- session("https://www.barchart.com/stocks/highs-lows/highs") # 提取并解码XSRF-TOKEN token <- s$response$cookies %>% filter(name == "XSRF-TOKEN") %>% pull(value) %>% URLdecode() # 使用会话发送请求(自动携带所有Cookie),替代单独的GET请求 res <- session_get(s, url = "https://www.barchart.com/proxies/core-api/v1/quotes/get", add_headers( Referer = "https://www.barchart.com/stocks/highs-lows/highs", `Accept` = "application/json", `Accept-Encoding` = "gzip, deflate", `Connection` = "keep-alive", `User-Agent` = "Mozilla/5.0 (X11; Linux x86_64; rv:108.0) Gecko/20100101 Firefox/108.0", `X-XSRF-TOKEN` = token ), query = list( lists = "stocks.us.new_highs_lows.highs.overall.1y", fields = "symbol,symbolName,lastPrice,priceChange,percentChange,volume,highHits1y,highPercent1y,lowPercent1y,tradeTime,symbolCode,symbolType,hasOptions", meta = "field.shortName,field.type,field.description,lists.lastUpdate", hasOptions = "true", page = "1", limit = "100", raw = "1" ) ) # 直接解析为JSON对象(自动处理压缩) data <- content(res, as = "parsed") str(data)
关键改动说明
- Cookie提取简化:用dplyr的
filter和pull直接定位XSRF-TOKEN,避免复杂的recode操作。 - 使用session_get发送请求:会话方法会自动携带之前建立的所有Cookie,无需手动拼接,确保服务器能识别会话身份。
- 响应解析优化:
as = "parsed"会自动根据响应头处理gzip/deflate压缩,并直接解析为R列表/数据框,比先转文本再解析更高效。
内容的提问来源于stack exchange,提问作者stucash
相关产品推荐
相关产品推荐

