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"]];<br>$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');<br>curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);<br>curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);<br>$html = curl_exec($ch);<br>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 中的 <meta charset="gb2312"> 不一致,导致 mb_convert_encoding() 误判。
- 先看响应头:
curl_getinfo($ch, CURLINFO_CONTENT_TYPE),例如text/html; charset=gbk - 再看 HTML 内 meta 标签(可能被 JS 动态插入,但静态页一般可靠)
- 转换建议顺序:
mb_convert_encoding($html, 'UTF-8', 'GBK')→ 若失败,尝试iconv('GBK', 'UTF-8//IGNORE', $html) - 若页面本身无明确编码声明,可用
mb_detect_encoding()辅助判断,但不可靠,慎用
遇到 JavaScript 渲染内容?file_get_contents() 和 cURL 都无能为力
它们只拿到服务器返回的原始 HTML,不执行 JS。像 Vue/React 单页应用、动态加载评论、异步拉取数据等场景,返回的 HTML 里往往只有空容器或占位符。
这时候必须换方案:
- 找接口:用浏览器开发者工具(Network → XHR / Fetch)看页面真实数据来源,直接请求 JSON 接口更稳定
- 服务端渲染(SSR)或预渲染(Prerender)的站点,可尝试加
_escaped_fragment_=参数(已基本淘汰) - 真要跑浏览器环境,得用 Puppeteer(Node.js)或 Playwright,PHP 生态没有成熟、轻量、可靠的 Headless 浏览器封装
- 强行用
exec('curl ... | node parse.js')调外部工具,维护成本高,不推荐
别在 PHP 里硬扛 JS 渲染——这不是语言限制,而是架构错配。抓不到,大概率说明你该换思路,而不是换函数。



















