使用file_get_contents抓取页面为何始终返回目标站点首页内容?
问题原因及解决方案
核心触发原因
- 站点HTTP重定向规则不标准:你用HTTP协议请求HTTPS站点时,站点没有按照路径做301/302跳转,而是将所有HTTP请求统一重定向到HTTPS首页,这是最高概率的诱因,你之前认为该因素不是问题根源的判断有误。
- 请求头校验不通过:
file_get_contents默认发送的请求头字段极少,站点校验User-Agent、Referer、Accept等常规浏览器请求头,判定为爬虫请求后统一返回首页内容。 - Cookie会话校验缺失:站点首次访问会下发会话Cookie,后续访问内页需要携带对应Cookie,
file_get_contents默认不会自动存储、携带请求返回的Cookie,导致所有请求都被判定为首次访问,返回首页。 - 反爬策略拦截:站点识别到请求来源为非浏览器环境,或者服务器IP被临时限制,统一返回首页响应。
排查解决步骤
- 优先将请求URL替换为HTTPS协议地址,不要使用HTTP请求HTTPS站点,先排除重定向规则问题。
- 为
file_get_contents自定义HTTP上下文,补全常规请求头,参考代码如下:
// 构造自定义请求上下文 $context = stream_context_create([ 'http' => [ 'method' => 'GET', 'header' => [ 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Referer: https://www.american-cosmograph.fr/', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' ], 'follow_location' => 1, 'max_redirects' => 3 ], 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false ] ]); // 用HTTPS地址发起请求 $targetUrl = 'https://www.american-cosmograph.fr/seances.html?view=seances&week=2021-10-11'; $content = file_get_contents($targetUrl, false, $context);
- 若上述方法无效,改用cURL扩展发起请求,开启Cookie自动处理和请求日志输出,可以更清晰的查看完整请求链路,定位重定向、拦截类问题。
内容的提问来源于stack exchange,提问作者Etienne Delcambre
相关产品推荐
相关产品推荐

