当前位置:首页 > PHP

php curl 实现爬虫

2026-02-16 12:59:57PHP

PHP cURL 实现爬虫的方法

使用 PHP 的 cURL 库可以高效地实现网页爬虫功能。以下是具体实现步骤和注意事项:

基本 cURL 请求

初始化 cURL 会话并获取网页内容:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://example.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
curl_close($ch);
echo $output;

设置用户代理

模拟浏览器访问避免被屏蔽:

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_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);

设置超时时间

防止长时间等待:

curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);

处理 HTTPS

忽略 SSL 证书验证(测试用):

php curl 实现爬虫

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

获取请求信息

获取详细请求信息:

$info = curl_getinfo($ch);
echo 'HTTP Code: ' . $info['http_code'];
echo 'Total Time: ' . $info['total_time'];

POST 请求示例

发送 POST 请求:

$postData = [
    'username' => 'test',
    'password' => '123456'
];
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);

处理 Cookie

保存和发送 Cookie:

curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');

处理压缩内容

自动解压 gzip 内容:

php curl 实现爬虫

curl_setopt($ch, CURLOPT_ENCODING, 'gzip');

多线程处理

使用 curl_multi 实现并发请求:

$mh = curl_multi_init();
$handles = [];

for ($i = 0; $i < 5; $i++) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://example.com/page/$i");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($mh, $ch);
    $handles[] = $ch;
}

do {
    curl_multi_exec($mh, $running);
    curl_multi_select($mh);
} while ($running > 0);

foreach ($handles as $ch) {
    $content = curl_multi_getcontent($ch);
    // 处理内容
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}

curl_multi_close($mh);

使用代理

设置代理服务器:

curl_setopt($ch, CURLOPT_PROXY, '127.0.0.1:8888');
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);

解析 HTML 内容

结合 DOMDocument 解析 HTML:

$dom = new DOMDocument();
@$dom->loadHTML($output);
$xpath = new DOMXPath($dom);
$titles = $xpath->query('//h1');
foreach ($titles as $title) {
    echo $title->nodeValue;
}

错误处理

检查 cURL 错误:

if (curl_errno($ch)) {
    echo 'cURL Error: ' . curl_error($ch);
}

性能优化建议

  • 复用 cURL 句柄减少连接开销
  • 合理设置并发数量避免被封禁
  • 使用缓存减少重复请求
  • 遵守 robots.txt 协议
  • 设置合理的请求间隔

完整示例代码

function fetchUrl($url) {
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
        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',
        CURLOPT_TIMEOUT => 30,
        CURLOPT_CONNECTTIMEOUT => 10,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_ENCODING => 'gzip'
    ]);

    $result = curl_exec($ch);
    if (curl_errno($ch)) {
        throw new Exception(curl_error($ch));
    }
    curl_close($ch);
    return $result;
}

try {
    $html = fetchUrl('https://example.com');
    // 处理获取的HTML内容
} catch (Exception $e) {
    echo 'Error: ' . $e->getMessage();
}

以上方法涵盖了 PHP cURL 实现爬虫的主要功能和技术要点,可根据实际需求进行调整和扩展。

标签: 爬虫php
分享给朋友:

相关文章

php长连接实现

php长连接实现

PHP 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HTTP…

php 购物车实现

php 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

php无限分类的实现

php无限分类的实现

PHP无限分类的实现 无限分类是一种常见的树形结构数据组织方式,适用于商品分类、菜单管理、地区选择等场景。以下是几种实现方法: 递归实现法 递归是最直观的实现方式,通过函数自身调用来遍历子分类。数据…

php怎么实现登录功能

php怎么实现登录功能

数据库准备 创建用户表存储登录信息,通常包括用户名、密码(需加密)等字段。示例SQL: CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY…

无限分类实现 php

无限分类实现 php

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、部门架构等。以下是几种常见的实现方式: 邻接列表模式(Adjacency List) 邻接列表是最简单的实现方式,通过在每个记录…

php实现推送消息推送消息

php实现推送消息推送消息

PHP 实现消息推送的方法 使用 WebSocket 实现实时推送 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适合实现实时消息推送。 安装 Ratchet 库(WebSo…