先确认真实HTTP状态码,再伪造User-Agent等请求头;若仍404,需检查是否JS渲染、WAF拦截或API接口,而非强行用PHP渲染页面。
不是目标页面真不存在,而是file_get_contents默认不发送User-Agent,多数搜索引擎或反爬站点会直接返回404或302跳转。它本质是HTTP客户端行为,不是“搜索引擎抓取”,别被标题误导。
get_headers($url)确认真实HTTP状态码,别只看file_get_contents是否返回空字符串$opts = [
'http' => [
'method' => 'GET'
,
'header' => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36\r\n"
]
];
$context = stream_context_create($opts);
$content = file_get_contents($url, false, $context);file_get_contents无法处理这些,得换方案常见于目标页依赖JavaScript动态加载内容,或服务端根据Accept、Accept-Language等头判断客户端类型。cURL默认头极简,容易被识别为非浏览器流量。
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36',
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language: en-US,en;q=0.5',
'Accept-Encoding: gzip, deflate',
'Connection: keep-alive',
]);
$content = curl_exec($ch);CURLOPT_FOLLOWLOCATION,避免因301/302跳转未跟随导致误判404curl_getinfo($ch, CURLINFO_HTTP_CODE)确认真实状态码,别依赖$content === false
如果目标页HTML里只有,而内容靠JS异步拉取,PHP原生HTTP函数完全无效——它们不执行JS,只拿原始HTML。
exec('node scraper.js')调用Puppeteer既慢又难维护当PHP抓取持续返回404,第一反应不该是“怎么让代码不报错”,而是验证:这个URL是否本就该404?有没有权限限制?是不是临时下线?有没有robots.txt禁止抓取?
file_get_contents和cURL只是工具,不能替代对目标站点规则的理解curl_getinfo返回的http_code、redirect_url、size_download
"Checking if the site connection is secure"这类特征字符串