怎么用PHP写爬虫?PHP爬虫入门简单实现方法有哪些

来源:Python编程网作者:越南程序员头衔:程序员
导读:本期聚焦于越南程序员创作的《怎么用PHP写爬虫?PHP爬虫入门简单实现方法有哪些》,敬请观看详情。很多刚接触PHP开发的用户想知道怎么用PHP写爬虫,其实PHP本身提供了多种内置函数和扩展可以实现简单的网页数据抓取功能。本文将从基础原理讲起,介绍两种常用的PHP爬虫实现方式,分别是使用file_get_contents函数和curl扩展,同时会讲解如何解析抓取到的网页内容,提取需要的目标数据。内容适合PHP入门开发者学习,步骤清晰,示例代码可直接运行,帮助大家快速掌握PHP爬虫的基础实现逻辑,满足日常简单的数据采集需求。

PHP爬虫的入门思路并不复杂,本质是通过程序模拟浏览器向目标地址发起请求,拿到网页返回的HTML文本,再从中筛选出需要的数据。整个过程通常分为几个步骤:确定目标网址、发送HTTP请求、读取响应内容、解析页面结构、提取有效信息、保存结果。对于初学者来说,不需要一开始就依赖复杂框架,利用PHP内置的网络读取函数、字符串处理能力以及正则表达式,就可以完成基础的网页抓取任务。

一、PHP爬虫的基本原理与运行环境

从访问流程来看,浏览器输入网址后会向服务器发送请求,服务器再返回HTML、CSS、JavaScript等资源。PHP爬虫做的事情与此类似,只是把人工点击和浏览变成了程序化请求。PHP程序拿到网页源码后,并不会像浏览器那样渲染页面,而是把页面内容当成一段字符串处理。只要目标页面中的数据结构相对稳定,就可以通过关键词定位、正则匹配或者固定标签结构提取的方式,把标题、链接、正文、列表等信息拿出来。

在开始编写爬虫之前,需要先确认PHP运行环境是否满足基本条件。一般来说,PHP版本建议在5.6及以上,这样可以使用较稳定的函数和数组语法。如果使用file_get_contents读取远程地址,需要确认PHP配置允许读取URL资源;如果使用cURL扩展,则需要在php.ini中开启curl模块。如果抓取的是https协议的网页,还需要开启openssl扩展,否则可能出现证书或加密协议相关的请求失败。很多本地集成开发环境默认已经开启这些扩展,因此在本地练习时通常不需要额外配置。

从实现方式上看,PHP入门爬虫主要有两类常用方法。第一类是使用file_get_contents快速读取网页内容,写法简单,适合抓取结构固定、没有复杂反爬限制的静态页面。第二类是使用cURL扩展发起请求,它可以设置请求头、用户代理、超时时间、POST参数等选项,对请求过程的控制更细,适合更接近真实浏览器行为的抓取任务。理解这两种方式的差异,有助于在实际练习中选择合适的实现方案。

二、使用file_get_contents完成简单抓取

file_get_contents是PHP内置的文件读取函数,它不仅可以读取本地文件,也可以读取通过网络地址返回的内容。当传入一个网址时,它会尝试请求该地址,并把响应内容以字符串形式返回。这种方式的优势是代码量少、逻辑直观,非常适合用来理解爬虫的基本流程。不过,它的局限也很明显:请求方式、请求头、超时细节、Cookie处理等都不容易精细控制,因此更适合简单场景。

基础抓取示例中,可以先定义目标网址,然后调用file_get_contents获取网页源码。如果函数返回false,说明抓取失败;如果返回字符串,则说明已经拿到页面内容。此时可以输出网页长度,也可以把内容写入本地文件,方便后续反复分析,避免频繁请求目标网站。

<?php
// 目标网页地址
$url = 'https://ipipp.com/example.html';

// 使用file_get_contents获取网页源码
$html = file_get_contents($url);

// 判断抓取是否成功
if ($html === false) {
    echo '抓取网页失败';
} else {
    echo '抓取到的网页长度:' . strlen($html) . '字符' . PHP_EOL;

    // 将网页内容保存到本地文件,便于后续分析
    file_put_contents('page.html', $html);
}
?>

拿到网页源码之后,下一步是从HTML中提取目标数据。假设页面中的核心标题放在<h1>标签里,就可以使用preg_match_all进行正则匹配。正则表达式会查找所有符合规则的片段,并把匹配结果保存到数组中。对于初学者来说,这种方式有助于理解“先获取完整页面,再从中筛选内容”的爬虫思路。

<?php
$url = 'https://ipipp.com/example.html';
$html = file_get_contents($url);

if ($html !== false) {
    // 匹配页面中所有h1标签的内容
    preg_match_all('/<h1>(.*?)</h1>/s', $html, $matches);

    if (!empty($matches[1])) {
        echo '提取到的h1标题:' . PHP_EOL;

        foreach ($matches[1] as $title) {
            echo trim($title) . PHP_EOL;
        }
    } else {
        echo '未找到h1标题';
    }
} else {
    echo '抓取网页失败';
}
?>

需要注意的是,file_get_contents虽然方便,但并不适合所有网页。有些网站会检查用户代理、来源页面、Cookie状态,或者要求特定的请求头;有些页面内容依赖JavaScript动态生成,直接读取HTML源码可能拿不到最终数据。遇到这些情况时,就需要使用控制能力更强的cURL扩展。

三、使用cURL提升请求控制能力

cURL是PHP中常用于发起网络请求的扩展,它通过一系列选项来描述请求行为。相比file_get_contentscURL可以明确设置请求地址、返回方式、超时时间、用户代理、POST数据等信息。这意味着程序可以更接近真实浏览器的工作方式,也能更稳定地处理网络异常。在入门阶段,先掌握几个最常用的选项即可。

下面是一个使用cURL抓取网页的基础示例。代码中先调用curl_init初始化会话,再通过curl_setopt设置请求参数。CURLOPT_RETURNTRANSFER用于让请求结果返回到变量中,而不是直接输出;CURLOPT_TIMEOUT用于限制最长等待时间,避免程序长时间卡住;CURLOPT_USERAGENT用于模拟浏览器身份。请求执行后,可以通过curl_error查看是否出现错误。

<?php
$url = 'https://ipipp.com/example.html';

// 初始化cURL会话
$ch = curl_init();

// 设置请求地址
curl_setopt($ch, CURLOPT_URL, $url);

// 设置返回结果保存到变量中,而不是直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// 设置超时时间,避免请求长时间无响应
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/120.0.0.0 Safari/537.36');

// 执行请求并获取响应内容
$html = curl_exec($ch);

// 获取请求错误信息
$error = curl_error($ch);

// 关闭cURL会话
curl_close($ch);

if ($html === false || $error !== '') {
    echo 'cURL请求失败:' . $error;
} else {
    echo '抓取成功,网页长度:' . strlen($html) . '字符';
}
?>

如果目标页面需要提交参数,例如搜索接口、表单接口或分页接口,就可以使用POST请求。在cURL中,设置CURLOPT_POST为真,并通过CURLOPT_POSTFIELDS传入参数数组即可。下面的示例模拟了一个搜索请求,提交关键词和页码参数。实际项目中,返回内容可能是HTML,也可能是JSON,入门阶段可以先输出结果,观察接口返回的数据结构。

<?php
$url = 'https://ipipp.com/search.php';

// 初始化cURL会话
$ch = curl_init();

// 设置请求地址
curl_setopt($ch, CURLOPT_URL, $url);

// 设置返回结果保存到变量中
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// 设置请求方式为POST
curl_setopt($ch, CURLOPT_POST, true);

// 设置POST参数
curl_setopt($ch, CURLOPT_POSTFIELDS, [
    'keyword' => 'PHP教程',
    'page' => 1
]);

// 设置超时时间
curl_setopt($ch, CURLOPT_TIMEOUT, 10);

// 执行请求
$result = curl_exec($ch);

// 获取错误信息
$error = curl_error($ch);

// 关闭会话
curl_close($ch);

if ($result === false || $error !== '') {
    echo 'POST请求失败:' . $error;
} else {
    echo '请求结果:' . PHP_EOL . $result;
}
?>

从学习角度看,file_get_contentscURL并不是互相替代的关系,而是适合不同阶段的工具。前者适合快速验证页面是否可抓取,后者适合处理更真实的网络请求。掌握二者的差异之后,就可以根据目标网站的复杂程度选择合适的方案。

实现方式优势局限适用场景
file_get_contents写法简单,代码量少请求头、Cookie、超时等控制能力有限简单静态网页抓取
cURL可设置请求头、用户代理、POST参数、超时时间配置项较多,入门时需要理解常用选项需要模拟浏览器请求或处理复杂接口

四、列表页抓取示例与爬虫使用规范

在入门练习中,列表页是非常典型的抓取对象。列表页通常包含一组结构相似的条目,例如文章标题、链接、发布时间等。假设页面中的列表项由<li>标签包裹,链接和标题位于<a>标签内部,那么就可以通过正则表达式一次性提取所有链接和标题。需要说明的是,正则匹配依赖页面结构,如果目标页面结构发生变化,匹配规则也需要相应调整。

下面的完整示例使用cURL抓取列表页,然后提取所有文章标题和链接。代码中先完成网络请求,再判断响应是否成功;如果成功,就使用preg_match_all匹配列表结构,并循环输出每一条结果。这个示例覆盖了PHP爬虫入门阶段最常见的几个动作:发起请求、判断结果、匹配内容、整理输出。

<?php
$url = 'https://ipipp.com/article_list.html';

// 初始化cURL会话
$ch = curl_init();

// 设置请求地址
curl_setopt($ch, CURLOPT_URL, $url);

// 设置返回结果保存到变量中
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// 设置超时时间
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/120.0.0.0 Safari/537.36');

// 执行请求
$html = curl_exec($ch);

// 获取错误信息
$error = curl_error($ch);

// 关闭会话
curl_close($ch);

if ($html === false || $error !== '') {
    echo '列表页抓取失败:' . $error;
} else {
    // 假设列表结构为 <li><a href="链接">标题</a></li>
    preg_match_all('/<li><a href="(.*?)">(.*?)</a></li>/s', $html, $matches);

    if (!empty($matches[1]) && !empty($matches[2])) {
        echo '抓取到的文章列表:' . PHP_EOL;

        foreach ($matches[1] as $index => $link) {
            echo '标题:' . trim($matches[2][$index]) . PHP_EOL;
            echo '链接:' . trim($link) . PHP_EOL;
            echo '--------' . PHP_EOL;
        }
    } else {
        echo '未匹配到文章列表';
    }
}
?>

除了技术实现,爬虫使用规范同样重要。抓取网页并不意味着可以随意采集所有数据,程序访问也需要遵守目标网站的规则和相关法律要求。入门阶段就应该养成良好的习惯,避免因为请求过快、采集不当或忽略规则而影响目标网站,也避免给自己带来不必要的风险。

  • 查看目标网站的robots.txt文件,确认允许抓取和禁止抓取的目录范围。
  • 控制请求频率,不要在短时间内发送大量请求,可以在每次请求之后调用sleep暂停一段时间。
  • 不要采集用户隐私数据,也不要抓取受版权保护且未经授权的内容。
  • 如果目标网站存在反爬机制,应先理解基础请求流程,再逐步学习请求头随机化、代理访问等进阶思路。

总体来说,PHP爬虫入门的关键在于先建立完整流程:能够发出请求,能够拿到HTML源码,能够从源码中提取目标字段,并能够把结果保存下来。在这个基础上,再逐步学习更复杂的请求控制、错误处理和数据清洗。对于初学者而言,先使用file_get_contents理解抓取逻辑,再过渡到cURL掌握请求细节,是一条比较平滑的学习路径。只要能够熟练完成静态页面的抓取与提取,就已经具备了继续深入学习爬虫开发的基础能力。

PHP爬虫file_get_contentscurl正则表达式修改时间:2026-06-29 13:42:38

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。