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

PHP cURL 模擬瀏覽器抓取網頁完整教學(含 Cookie、POST、User-Agent、代理)

     編輯:PHP 相關知識

cURL 簡介

cURL 是支援多種協定(HTTP、HTTPS、FTP、FTPS 等)的傳輸工具,PHP 透過 curl_* 函數族提供完整封裝,適合模擬瀏覽器進行登入、抓取、API 串接。

四步驟核心流程

  1. curl_init() 初始化
  2. curl_setopt() 設定選項(最關鍵)
  3. curl_exec() 執行請求
  4. curl_close() 釋放資源

基礎 POST 範例


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

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
$response = curl_exec($ch);
curl_close($ch);
echo $response;

完整模擬登入流程(Cookie 管理)


$loginUrl = 'https://bbs.example.com/login.php';
$targetUrl = 'https://bbs.example.com/';

$cookieFile = sys_get_temp_dir() . '/curl_cookie_' . md5($loginUrl) . '.txt';

$postData = http_build_query([
    'forward' => '',
    'jumpurl' => $targetUrl,
    'step' => 2,
    'lgt' => 0,
    'pwuser' => 'YOUR_USER',
    'pwpwd' => 'YOUR_PASS',
    'question' => 0,
    'hideid' => 1,
]);

// --- 階段 1:登入並存 Cookie ---
$ch = curl_init($loginUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); // 寫入 Cookie
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);  // 自動追蹤 302
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 開發環境
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
curl_exec($ch);
curl_close($ch);

// --- 階段 2:攜帶 Cookie 存取需登入頁面 ---
$ch = curl_init($targetUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // 讀取 Cookie
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 ...');
$content = curl_exec($ch);
curl_close($ch);

echo $content; // 登入後才能看到的內容

關鍵選項速查表

選項用途常用值
CURLOPT_URL請求網址字串
CURLOPT_POST啟用 POSTtrue
CURLOPT_POSTFIELDSPOST 資料陣列或 query string
CURLOPT_RETURNTRANSFER回傳字串而非直接輸出true
CURLOPT_HEADER包含回應 Headerfalse
CURLOPT_COOKIEJARCookie 儲存檔(寫入)檔案路徑
CURLOPT_COOKIEFILECookie 讀取檔檔案路徑
CURLOPT_FOLLOWLOCATION自動追蹤重導向true
CURLOPT_MAXREDIRS最大重導向次數10
CURLOPT_SSL_VERIFYPEER驗證 SSL 憑證false(開發)/true(生產)
CURLOPT_SSL_VERIFYHOST驗證 SSL 主機名2
CURLOPT_USERAGENT瀏覽器識別字串Mozilla/5.0 ...
CURLOPT_REFERER來源頁面URL
CURLOPT_TIMEOUT總逾時秒數30
CURLOPT_CONNECTTIMEOUT連線逾時秒數10
CURLOPT_PROXYHTTP 代理ip:port
CURLOPT_PROXYUSERPWD代理認證user:pass
CURLOPT_HTTPHEADER自定 Header 陣列['Accept: application/json']

常見問題排查

  • Cookie 不生效:Windows 下 CURLOPT_COOKIEJAR/FILE 路徑需可寫入,建議用 sys_get_temp_dir()。
  • HTTPS 失敗:生產環境必須啟用 CURLOPT_SSL_VERIFYPEER => true 並設定 CURLOPT_CAINFO 指向 cacert.pem。
  • 亂碼:回應編碼非 UTF-8 時,用 mb_convert_encoding($response, 'UTF-8', 'GB2312') 轉碼。
  • 反爬蟲:加入隨機延遲、輪換 User-Agent/Proxy、處理驗證碼、使用 Headless Chrome (Puppeteer/PHP-WebDriver)。

封裝建議

將上述邏輯封裝為 HttpClient 類別,支援鏈式呼叫、自動 Cookie 管理、錯誤重試、PSR-7/18 相容,方便在專案中複用。

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