在缺乏 cURL 擴展的伺服器環境中,Snoopy 是一個極佳的替代方案。它是一個純 PHP 實現的類別,能模擬瀏覽器行為,完成網頁內容抓取、表單提交、連結提取等任務,無需額外擴展支援,相容 PHP 4 以上版本。
fetch()(完整內容)、fetchtext()(純文字)、fetchlinks()(連結)、fetchform()(表單)| 方法 | 用途 | 回傳資料位置 |
|---|---|---|
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";
}
}
?>
Snoopy 雖屬經典專案,但在無法安裝擴展的共享主機、快速原型開發、簡易採集腳本等場景下,仍具備不可替代的輕量優勢。