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

PHP 網頁採集利器:Snoopy 類完整使用指南

     編輯:PHP 相關知識

Snoopy:純 PHP 實現的瀏覽器模擬類別

在缺乏 cURL 擴展的伺服器環境中,Snoopy 是一個極佳的替代方案。它是一個純 PHP 實現的類別,能模擬瀏覽器行為,完成網頁內容抓取、表單提交、連結提取等任務,無需額外擴展支援,相容 PHP 4 以上版本。

核心功能特色

  • 多樣化抓取:fetch()(完整內容)、fetchtext()(純文字)、fetchlinks()(連結)、fetchform()(表單)
  • 完整 HTTP 模擬:支援代理、Basic 認證、自訂 User-Agent、Referer、Cookie、Header
  • 重導向控制:可設定最大重導向次數、是否允許跨站重導向
  • 連結自動補全:相對路徑自動轉為完整 URL
  • 框架支援:能追蹤並抓取框架頁面內容
  • Cookie 保持:重導向過程中自動傳遞 Cookie

核心方法速查

方法用途回傳資料位置
fetch($uri)抓取完整頁面$this->results
fetchtext($uri)抓取純文字(去 HTML)$this->results
fetchlinks($uri)抓取所有連結$this->results(陣列)
fetchform($uri)抓取表單結構$this->results(陣列)
submit($uri, $formvars)提交表單$this->results
submittext($uri, $formvars)提交並取純文字$this->results
submitlinks($uri)提交並取連結$this->results(陣列)

快速上手範例

基本抓取

<?php
include "Snoopy.class.php";
$snoopy = new Snoopy;
$url = "https://example.com";

if ($snoopy->fetch($url)) {
    echo $snoopy->results; // 顯示完整 HTML
} else {
    echo "錯誤:" . $snoopy->error;
}
?>

只取純文字

$snoopy->fetchtext($url);
echo $snoopy->results;

提取所有連結

$snoopy->fetchlinks($url);
print_r($snoopy->results); // 陣列格式

進階應用:模擬登入與偽裝

<?php
include "Snoopy.class.php";
$snoopy = new Snoopy;

// 偽裝瀏覽器
$snoopy->agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36";
$snoopy->referer = "https://example.com/login.php";

// 設定 Cookie(如已知 Session ID)
$snoopy->cookies["PHPSESSID"] = "abc123def456";

// 設定代理(可選)
// $snoopy->proxy_host = "proxy.example.com";
// $snoopy->proxy_port = "8080";

// 表單資料
$formvars["username"] = "myuser";
$formvars["password"] = "mypass";
$action = "https://example.com/login_check.php";

// 提交登入
if ($snoopy->submit($action, $formvars)) {
    // 登入成功,可繼續抓取會員頁面
    $snoopy->fetch("https://example.com/member_area.php");
    echo $snoopy->results;
} else {
    echo "登入失敗:" . $snoopy->error;
}
?>

重要屬性配置

  • $maxredirs:最大重導向次數(預設 5,0 為禁用)
  • $offsiteok:是否允許跨域重導向(預設 true)
  • $expandlinks:是否自動補全相對連結(預設 true)
  • $user / $pass:HTTP Basic 認證帳密
  • $rawheaders:自訂額外 Header 陣列
  • $read_timeout:讀取超時秒數(0 為無限制)

實戰範例:批次下載圖片

<?php
include 'Snoopy.class.php';
$snoopy = new Snoopy();
$listUrl = "https://example.com/gallery/";

// 1. 取得列表頁所有連結
$snoopy->fetchlinks($listUrl);
$links = $snoopy->results;

// 2. 篩選文章頁連結(假設為 /article/123.html 格式)
$articleLinks = array_filter($links, function($url) {
    return preg_match('#/article/\d+\.html$#', $url);
});

// 3. 逐頁抓取圖片
foreach ($articleLinks as $articleUrl) {
    $snoopy->fetch($articleUrl);
    $html = $snoopy->results;
    
    // 匹配圖片標籤
    preg_match_all('/<img[^>]+src=["\']([^"\']+\.(?:jpg|png|gif|webp))["\']/i', $html, $matches);
    
    foreach ($matches[1] as $imgUrl) {
        // 下載並儲存邏輯...
        echo "發現圖片:$imgUrl\n";
    }
}
?>

注意事項與限制

  • 純 PHP 實現,大檔案或高併發時效能不如 cURL
  • 不支援 JavaScript 渲染(需配合 Headless Chrome/Puppeteer)
  • SSL 憑證驗證較弱,正式環境建議改用 cURL 或 Guzzle
  • 專案官網:snoopy.sourceforge.net

Snoopy 雖屬經典專案,但在無法安裝擴展的共享主機、快速原型開發、簡易採集腳本等場景下,仍具備不可替代的輕量優勢。

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