获取网页源码是PHP开发中非常常见的需求,无论是做数据采集、页面监控还是内容分析,第一步都是把目标页面的HTML抓下来。PHP提供了多种实现方式,从最简单的file_get_contents到功能强大的cURL,再到Guzzle这样的现代HTTP客户端库,各有各的适用场景。本文会把几种方法的写法、参数配置和常见坑都讲清楚,最后再给出把源码保存到本地文件的完整方案。

一、使用file_get_contents快速获取源码
file_get_contents是PHP内置的文件读取函数,它不仅能读本地文件,也可以读取URL,前提是php.ini中的allow_url_fopen选项是开启状态。它的写法最简单,一行代码就能拿到网页源码:
<?php
// 最简单的用法:直接传入网址
$url = 'https://www.ipipp.com/';
$html = file_get_contents($url);
if ($html === false) {
die('抓取失败,请检查网址是否可访问');
}
// 输出源码
echo $html;
?>不过直接这样写会经常遇到抓不到内容的情况,因为很多网站会校验请求头,没有User-Agent的请求可能直接被拒绝,返回的内容是空的或者报错。这时可以通过stream_context_create来构造一个上下文,模拟浏览器发送请求:
<?php
$url = 'https://www.ipipp.com/';
// 构造请求选项
$options = [
'http' => [
'method' => 'GET',
'header' => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)\r\n" .
"Accept: text/html,application/xhtml+xml\r\n",
'timeout' => 10, // 超时时间,单位秒
],
];
$context = stream_context_create($options);
$html = file_get_contents($url, false, $context);
echo $html;
?>注意header中的每个请求头之间要用\r\n分隔,漏掉的话请求头会被拼在一起导致无效。这个方法的优点是简单、不需要额外扩展,缺点是功能比较有限,比如处理重定向、携带Cookie、提交POST数据等场景写起来很麻烦,遇到复杂需求建议直接用cURL。
二、使用cURL抓取网页源码
cURL是PHP中最专业的HTTP请求工具,需要服务器安装并启用cURL扩展(大多数环境默认都有)。它的功能非常全面,请求头、Cookie、代理、HTTPS验证、POST提交都能轻松控制,是正式项目里抓取网页的首选方案。下面是一个标准的cURL抓取写法:
<?php
function fetchPage($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回内容而不是直接输出
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 跟随301/302重定向
curl_setopt($ch, CURLOPT_TIMEOUT, 15); // 总超时
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); // 连接超时
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过HTTPS证书校验
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
$html = curl_exec($ch);
if ($html === false) {
echo 'cURL错误: ' . curl_error($ch);
curl_close($ch);
return false;
}
// 获取HTTP状态码
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status != 200) {
echo '请求失败,状态码: ' . $status;
return false;
}
return $html;
}
// 调用
$html = fetchPage('https://www.ipipp.com/');
echo $html;
?>这里有几点需要说明。CURLOPT_RETURNTRANSFER一定要设为true,否则抓到的内容会被直接打印出来而不是存进变量;CURLOPT_FOLLOWLOCATION设为true后遇到跳转会自动跟进,很多网址会先302再落到真实页面,不开这个选项抓到的就是跳转提示页。如果目标站是HTTPS且服务器缺少CA证书包,会报SSL certificate problem错误,临时可以设置CURLOPT_SSL_VERIFYPEER为false解决,但生产环境建议正确配置证书。
抓取到的页面编码如果不是UTF-8(比如很多老网站是GBK),中文会显示成乱码。可以先从HTML的meta标签里判断编码,再用iconv或mb_convert_encoding转换:
<?php
// 检测并转换编码为UTF-8
if (preg_match('/charset=([\w-]+)/i', substr($html, 0, 1000), $m)) {
$charset = strtoupper($m[1]);
if ($charset != 'UTF-8') {
$html = mb_convert_encoding($html, 'UTF-8', $charset);
}
}
?>三、把网页源码保存到本地文件
拿到源码之后,保存到本地非常简单。可以用file_put_contents一次性写入,也可以用cURL直接把内容写到文件里,避免大文件占用太多内存。先看最常用的写法:
<?php
// 方式一:先抓取再写入
$html = fetchPage('https://www.ipipp.com/');
if ($html !== false) {
// 文件名加上日期避免覆盖,保存到 D:\spider\ 目录
$file = 'D:\spider\page_' . date('Ymd_His') . '.html';
file_put_contents($file, $html);
echo '已保存到: ' . $file;
}
// 方式二:cURL直接写文件,适合大页面
$fp = fopen('D:\spider\output.html', 'w');
$ch = curl_init('https://www.ipipp.com/');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);
curl_close($ch);
fclose($fp);
?>注意Windows路径要写成D:\spider\这种形式,盘符后面紧跟反斜杠,且目录必须真实存在,否则fopen会报错。如果需要批量保存多个页面,把网址放进数组循环调用即可,最好在每次请求之间加个sleep(1)延迟,一方面减轻对方服务器压力,另一方面降低被反爬封IP的概率。
另外提醒一点,抓取网页源码时要遵守目标网站的robots协议和使用条款,控制好请求频率,不要对服务器造成负担。如果对方提供了API接口,优先走接口而不是解析HTML。掌握file_get_contents、cURL和文件保存这套组合之后,大部分源码获取的需求都能顺利搞定。
php网页源码网页抓取file_get_contents修改时间:2026-09-09 15:20:52