CURLOPT_FOLLOWLOCATION失效,抓取重定向网站页面为空求助
嘿,我来帮你解决这个cURL抓取重定向的问题!结合你提到的情况,我分两种常见的重定向场景给你解决方案:
一、处理HTTP头层面的3xx重定向
很多网站会用HTTP 301/302这类状态码做重定向,但默认情况下cURL并不会自动跟随这些重定向,这是导致你抓取失败的常见原因。你只需要给cURL添加跟随重定向的配置即可:
- 开启自动跟随:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);,默认最多跟随50次重定向 - 可选:自定义最大重定向次数,比如限制为10次:
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
给你一个完整的示例代码:
// 初始化cURL会话 $ch = curl_init('https://你要抓取的目标网站'); // 设置返回内容不直接输出,而是存到变量里 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 开启自动跟随重定向 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 可选:设置最大重定向次数 curl_setopt($ch, CURLOPT_MAXREDIRS, 10); // 可选:如果是HTTPS网站,临时跳过证书验证(仅测试用,生产环境建议保留验证) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 可选:模拟浏览器User-Agent,避免被网站拦截 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'); // 执行抓取 $content = curl_exec($ch); // 检查是否有错误 if(curl_errno($ch)){ echo 'cURL执行出错:' . curl_error($ch); } // 关闭会话 curl_close($ch); // 输出抓取到的内容 echo $content;
二、处理JS/HTML Meta倒计时重定向(就是你贴的那种20秒倒计时跳转)
你提供的代码是JS触发的倒计时跳转,这种不属于HTTP头重定向,cURL本身不会解析JS,所以得手动提取跳转目标再抓取:
- 先抓取带倒计时的页面内容
- 从内容里提取最终的跳转URL(可能在JS或者meta标签里)
- 用cURL抓取这个目标URL
比如针对你贴的JS倒计时场景,提取跳转URL的示例代码:
// 先抓取带倒计时的页面 $ch = curl_init('https://带倒计时的目标网站'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'); $pageContent = curl_exec($ch); curl_close($ch); // 用正则提取JS里的跳转URL(根据目标网站的JS代码调整正则) preg_match('/window\.location\.href\s*=\s*["\'](.*?)["\']/i', $pageContent, $matches); if(isset($matches[1])){ $targetUrl = $matches[1]; // 再抓取最终的目标URL $ch2 = curl_init($targetUrl); curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch2, CURLOPT_FOLLOWLOCATION, true); $finalContent = curl_exec($ch2); curl_close($ch2); echo $finalContent; }else{ echo '未能从页面中提取到跳转目标地址'; }
小提示:如果网站是用meta标签做倒计时跳转(比如<meta http-equiv="refresh" content="20; url=目标地址">),可以把正则换成:preg_match('/meta.*?content\s*=\s*["\']\d+;\s*url=(.*?)["\']/i', $pageContent, $matches)
内容的提问来源于stack exchange,提问作者Mohit Mishra
相关产品推荐
相关产品推荐

