PHP抓取Investing.com全球主要指数实时数据存在延迟问题求助
问题原因及解决方案
原因分析
请求方式错误:你用
POST请求访问该页面,但该页面正常通过GET加载。服务器收到不符合预期的POST请求时,可能返回缓存的历史数据而非实时内容。同时你设置的Content-type头是表单提交专用,对GET请求完全多余,会导致请求被识别为异常。请求头缺失:你的请求没有模拟浏览器的
User-Agent、Accept等关键标识,被服务器判定为非浏览器请求后,返回缓存的静态快照,而非实时更新的数据。动态数据加载机制:该网站的实时指数数据并非嵌入初始HTML,而是页面加载后通过JavaScript异步调用API获取的。
file_get_contents只能抓取初始静态HTML,其中仅包含页面加载时的历史数据,无法获取JS动态加载的实时内容。服务器缓存策略:网站对非浏览器请求启用了更长的缓存周期,返回的是之前生成的页面副本,而非实时数据。
解决方案
修正请求配置
将请求方式改为GET,并添加模拟浏览器的请求头,示例代码:$url = "https://www.investing.com/indices/major-indices"; $options = array( 'http' => array( 'header' => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36\r\n" . "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\n", 'method' => 'GET' ) ); $context = stream_context_create($options); $result = file_get_contents($url, false, $context);注:即使修正,仍可能无法获取实时数据,因为核心数据是动态加载的。
直接调用实时数据API
打开浏览器开发者工具(F12),切换到「网络」标签,刷新页面后筛选XHR/Fetch请求,找到获取指数实时数据的API接口,直接请求该接口即可拿到准确的实时数据,这是最高效的方式。使用无头浏览器渲染页面
如果需要获取完整的渲染后页面内容,可以使用PHP无头浏览器库(如spatie/browsershot),模拟浏览器加载并执行JavaScript,从而获取包含实时数据的页面内容。
内容的提问来源于stack exchange,提问作者Blank
相关产品推荐
相关产品推荐

