PHP 擁有低門檻、快速開發的特性,雖然常被批評為「quick and dirty」,但正如名言所說:「這世界上只有兩種程式語言,一種是備受爭議的,一種是沒人用的。」只要能解決問題,PHP 就是優秀的工具。本文將示範如何用 PHP 結合 cURL 與正則表達式,從指定網頁批次抓取並下載圖片(支援 JPG、PNG、GIF、BMP 格式)。
完整程式包含表單送出、cURL 取得網頁原始碼、正則比對圖片網址、以及將圖片二進位流寫入本地檔案四大步驟。以下為關鍵函式說明:
<?php
function CurlGet($url) {
$url = str_replace('&', '&', $url);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($curl, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($curl, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 0);
$values = curl_exec($curl);
curl_close($curl);
return $values;
}
?>
<?php
function get_pic($pic_url) {
$data = CurlGet($pic_url);
// 分別比對四種常見圖片格式
$patterns = [
'/<img.*?src\=\"(.*?\.jpg).*?>/',
'/<img.*?src\=\"(.*?\.bmp).*?>/',
'/<img.*?src\=\"(.*?\.png).*?>/',
'/<img.*?src\=\"(.*?\.gif).*?>/'
];
$all_matches = [];
foreach ($patterns as $pattern) {
preg_match_all($pattern, $data, $matches);
$all_matches = array_merge($all_matches, $matches[1]);
}
echo '=============================================抓取開始=============================================<br />';
foreach ($all_matches as $img_url) {
download_image($img_url);
}
echo '=============================================抓取結束=============================================<br />';
}
?>
<?php
function download_image($pic_item) {
// 取得檔名(去除路徑)
$pattern_type = '/.*\/(.*?)$/';
preg_match_all($pattern_type, $pic_item, $match_type);
$filename = $match_type[1][0];
// 以二進位模式開啟檔案並寫入
$write_fd = @fopen($filename, "wb");
echo "圖片網址:{$pic_item}<br />";
@fwrite($write_fd, CurlGet($pic_item));
@fclose($write_fd);
}
?>
fetch_images.php)。提醒:實際部署時請加入錯誤處理(如檢查 fopen、curl_exec 回傳值)、限制下載大小、遵守目標網站 robots.txt 以及版權規範。此外,現代網頁多採用 JavaScript 動態載入圖片,單純抓取靜態 HTML 可能無法取得所有圖片,進階需求建議搭配 Headless Chrome(如 Puppeteer)或使用現成爬蟲框架(如 Goutte、Symfony Panther)。