file_get_contents()适合无反爬、无JS渲染的简单网页抓取,需开启allow_url_fopen;cURL适用于重定向、Cookie、POST等复杂场景;乱码优先查Content-Type和meta编码;JS渲染内容须找API或换Headless方案。

用 file_get_contents() 抓取简单网页最直接
如果目标网页没反爬、没 JavaScript 渲染、且允许 GET 请求,file_get_contents() 是最快捷的方式。它本质是发起一次 HTTP GET,返回原始响应体。
注意:allow_url_fopen 必须为 On(PHP 默认开启,但某些共享主机或安全加固环境会关闭)。
- 示例:
$html = file_get_contents('https://example.com'); - 带基础请求头(如模拟浏览器)需配合
stream_context_create():$opts = ['http' => ['header' => "User-Agent: Mozilla/5.0\r\n"]];
$html = file_get_contents('https://example.com', false, stream_context_create($opts)); - 超时控制必须显式设置,否则可能卡死:
'timeout' => 10(单位秒) - 遇到 4xx/5xx 状态码,
file_get_contents()仍会返回内容(除非网络层失败),不会抛异常,需自行检查$http_response_header
用 cURL 处理重定向、Cookie 和 POST 请求
当需要登录、表单提交、处理跳转或精细控制请求生命周期时,cURL 是实际项目中的标准选择。
常见坑点:默认不跟随 302 重定向;不自动管理 Cookie;SSL 验证在某些自签名或旧站点上会失败。
立即学习“PHP免费学习笔记(深入)”;
- 基础 GET 并自动跳转:
$ch = curl_init('https://example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$html = curl_exec($ch);
curl_close($ch); - 携带 Cookie(如维持登录态):
curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID=abc123;') - 跳过 SSL 验证(仅调试用,生产禁用):
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); - 获取真实 URL(跳转后):
curl_getinfo($ch, CURLINFO_EFFECTIVE_URL)
抓到的内容是乱码?优先检查 Content-Type 和编码声明
中文网页常因 HTTP 响应头的 charset 与 HTML 中的 涓











