首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP cURL 實戰:模擬瀏覽器抓取網頁、模擬登錄與 Cookie 管理全攻略

     編輯:PHP 綜合知識

cURL 是 PHP 中最強大的 HTTP 客戶端庫,支援 HTTP/HTTPS、FTP、代理、Cookie、認證、斷點續傳等豐富功能。本文從基礎四步驟入手,通過實戰案例講解 POST 請求、模擬登錄保持會話、Cookie 文件存儲陷阱等核心技巧。

cURL 基礎四步驟

$ch = curl_init();           // 1. 初始化
curl_setopt($ch, CURLOPT_URL, $url);       // 2. 設置選項(核心)
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 返回內容而非直接輸出
$data = curl_exec($ch);      // 3. 執行請求
curl_close($ch);             // 4. 關閉釋放資源

關鍵選項速查:

  • CURLOPT_POST = 1 → POST 請求
  • CURLOPT_POSTFIELDS → POST 數據(字符串或數組)
  • CURLOPT_COOKIEJAR → 响應 Cookie 保存文件路徑
  • CURLOPT_COOKIEFILE → 請求攜帶 Cookie 文件路徑
  • CURLOPT_FOLLOWLOCATION = true → 自動跟隨 301/302 重定向
  • CURLOPT_SSL_VERIFYPEER = false → 忽略 SSL 證書驗證(開發/測試用)
  • CURLOPT_USERAGENT → 模擬瀏覽器 UA
  • CURLOPT_TIMEOUT → 超時秒數

實戰 1:簡單 POST 登錄請求

$url = 'https://example.com/login.php';
$postData = http_build_query(['username' => 'user', 'password' => 'pass']);

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $postData,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_COOKIEJAR => 'cookie.txt', // 保存登錄後的 Cookie
    CURLOPT_FOLLOWLOCATION => true,
]);
$response = curl_exec($ch);
curl_close($ch);

實戰 2:模擬論壇登錄並訪問受保護頁面(Cookie 持久化)

關鍵點: Windows 系統下 Cookie 文件必須存放在 ./temp 目錄,否則讀取失效(親測坑點)。

$loginUrl = 'https://bbs.example.com/login.php';
$indexUrl = 'https://bbs.example.com/';
$cookieFile = tempnam('./temp', 'cookie'); // 生成唯一臨時文件

// 步驟 1:提交登錄表單,保存 Cookie
$postData = http_build_query([
    'pwuser' => 'username',
    'pwpwd' => 'password',
    'forward' => '',
    'jumpurl' => $indexUrl,
    'step' => 2,
    'lgt' => 0,
    'question' => 0,
    'hideid' => 1,
]);

$ch = curl_init($loginUrl);
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $postData,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_COOKIEJAR => $cookieFile,   // 保存 Cookie
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_HEADER => 0,
]);
curl_exec($ch);
curl_close($ch);

// 步驟 2:攜帶 Cookie 訪問首頁
$ch = curl_init($indexUrl);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => false, // 直接輸出
    CURLOPT_COOKIEFILE => $cookieFile, // 讀取 Cookie
    CURLOPT_HEADER => 0,
]);
curl_exec($ch);
curl_close($ch);

進階技巧

1. 發送 JSON 數據

$json = json_encode(['key' => 'value']);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'Content-Length: ' . strlen($json)
]);

2. 代理與 SSL

curl_setopt($ch, CURLOPT_PROXY, '127.0.0.1:8080');
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

3. 獲取詳細響應信息

curl_setopt($ch, CURLINFO_HEADER_OUT, true); // 記錄發送的請求頭
$response = curl_exec($ch);
$info = curl_getinfo($ch); // HTTP 碼、耗時、重定向 URL 等
$requestHeader = curl_getinfo($ch, CURLINFO_HEADER_OUT);

常見錯誤排查

現象可能原因解決
返回空/false網絡不通、域名解析失敗、SSL 驗證失敗檢查 curl_error($ch)、關閉 SSL 驗證、檢查 DNS
Cookie 不生效路徑權限、Windows 非 temp 目錄、域名路徑不匹配用 tempnam('./temp','cookie')、確保可寫
重定向失敗未開啟 FOLLOWLOCATION、安全模式限制開啟選項、或手動解析 Location 頭遞歸請求
中文亂碼編碼不一致設置 CURLOPT_ENCODING => 'gzip,deflate'、響應手動 mb_convert_encoding

總結

cURL 是 PHP 爬蟲、API 對接、模擬登錄的利器。掌握 Cookie 機制、請求頭構造、錯誤處理、性能優化(並發可用 curl_multi),即可應對 99% 的 HTTP 交互場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved