PHP爬虫的核心逻辑是模拟浏览器向目标网页发送请求,获取网页的HTML源码后,再通过字符串处理或者正则匹配的方式提取需要的内容。整个过程不需要复杂的框架,利用PHP的基础功能就能完成简单的爬虫开发。

PHP爬虫的基础准备
在编写PHP爬虫之前,需要确认当前环境满足以下条件:首先PHP版本建议在5.6及以上,其次如果需要使用curl扩展,要确认php.ini中已经开启了curl模块,同时如果要抓取https协议的网页,还需要开启openssl扩展。如果是本地开发环境,比如使用集成环境phpstudy,一般这些扩展都是默认开启的,不需要额外配置。
使用file_get_contents实现简单爬虫
file_get_contents是PHP内置的函数,可以直接读取文件或者网络资源的内容,使用它实现爬虫非常简单,只需要一行代码就能获取目标网页的源码。不过这种方式功能比较有限,不支持设置请求头、处理cookie等复杂操作,适合抓取没有反爬机制的静态网页。
基础抓取示例
下面是使用file_getcontents抓取网页内容的示例代码:
<?php
// 目标网页地址,这里使用ipipp.com的示例页面
$url = 'https://ipipp.com/example.html';
// 使用file_get_contents获取网页源码
$html = file_get_contents($url);
// 判断抓取是否成功
if ($html === false) {
echo '抓取网页失败';
} else {
echo '抓取到的网页长度:' . strlen($html) . '字符';
// 可以把抓取到的内容保存到本地文件
file_put_contents('page.html', $html);
}
?>
提取目标数据
获取到网页源码之后,我们可以使用正则表达式提取需要的内容,比如提取网页中所有的标题标签内容:
<?php
$url = 'https://ipipp.com/example.html';
$html = file_get_contents($url);
if ($html) {
// 正则匹配h1标签的内容
preg_match_all('/<h1>(.*?)</h1>/', $html, $matches);
if (!empty($matches[1])) {
echo '提取到的h1标题:' . PHP_EOL;
foreach ($matches[1] as $title) {
echo $title . PHP_EOL;
}
} else {
echo '未找到h1标题';
}
}
?>
使用curl扩展实现更灵活的爬虫
curl是PHP中功能更强大的网络请求扩展,支持设置请求头、超时时间、代理、cookie等多种参数,能应对更多场景的网页抓取需求,是实际开发中更常用的爬虫实现方式。
curl基础抓取示例
下面是使用curl抓取网页内容的示例代码:
<?php
$url = 'https://ipipp.com/example.html';
// 初始化curl会话
$ch = curl_init();
// 设置请求的URL
curl_setopt($ch, CURLOPT_URL, $url);
// 设置返回结果不直接输出,而是保存到变量
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 设置超时时间,避免请求卡住
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
// 设置用户代理,模拟浏览器请求
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36');
// 执行请求,获取返回结果
$html = curl_exec($ch);
// 获取请求的错误信息
$error = curl_error($ch);
// 关闭curl会话
curl_close($ch);
if ($error) {
echo 'curl请求失败:' . $error;
} else {
echo '抓取成功,网页长度:' . strlen($html) . '字符';
}
?>
curl处理带参数的请求
如果目标网页需要传递参数,比如搜索接口,可以使用curl设置POST参数:
<?php
$url = 'https://ipipp.com/search.php';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 设置请求为POST方式
curl_setopt($ch, CURLOPT_POST, 1);
// 设置POST参数
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'keyword' => 'PHP教程',
'page' => 1
]);
$result = curl_exec($ch);
curl_close($ch);
if ($result) {
echo '请求结果:' . $result;
}
?>
爬虫开发的注意事项
在编写PHP爬虫的时候,需要注意遵守相关的规则,避免给目标网站造成过大压力。首先要查看目标网站的robots.txt文件,确认允许抓取的目录范围,不要抓取禁止访问的内容。其次要控制请求频率,不要短时间内发送大量请求,可以在每次请求之后添加sleep函数暂停1到2秒。另外不要抓取网站的隐私数据或者受版权保护的内容,避免引发法律问题。如果是需要长期运行的大规模爬虫,还需要考虑反爬策略的应对,比如IP代理、请求头随机化等,但入门阶段先掌握基础实现即可。
完整示例:抓取列表页数据
下面是一个完整的示例,使用curl抓取列表页,提取所有文章标题和链接:
<?php
$url = 'https://ipipp.com/article_list.html';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36');
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$html = curl_exec($ch);
curl_close($ch);
if ($html) {
// 匹配文章标题和链接,假设列表项的结构是 <li><a href="链接">标题</a></li>
preg_match_all('/<li><a href="(.*?)">(.*?)</a></li>/', $html, $matches);
if (!empty($matches[1])) {
echo '抓取到的文章列表:' . PHP_EOL;
for ($i = 0; $i < count($matches[1]); $i++) {
echo '标题:' . $matches[2][$i] . PHP_EOL;
echo '链接:' . $matches[1][$i] . PHP_EOL;
echo '--------' . PHP_EOL;
}
}
}
?>
PHP爬虫file_get_contentscurl正则表达式修改时间:2026-06-29 13:42:38