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

PHP 網頁圖片采集器:提取頁面所有圖片並下載保存到本地

     編輯:PHP 綜合知識

PHP 實現圖片采集:解析 HTML 提取 <img> src、下載保存、自動命名、錯誤處理

批量下載網頁圖片是常見需求 (素材收集、鏡像站、數據分析)。本代碼實現:獲取頁面 → 正則提取 <img src="..."> → 逐個下載 → 保存至 download/ 目錄 → 自動按時間命名、保留擴展名。

核心功能模塊

<?php
header("Content-Type: text/html; charset=utf-8"); // 網頁輸出用 HTML,非圖片

// 1. 獲取頁面內容
function read_url($url) {
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; PHP Image Collector)',
    ]);
    $content = curl_exec($ch);
    curl_close($ch);
    return $content;
}

// 2. 提取圖片 URL
function extract_image_urls($html) {
    // 兼容單雙引號、無引號、屬性順序
    preg_match_all('/<img\s+[^>]*src\s*=\s*["\']?([^"\'\s>]+)["\']?/i', $html, $matches);
    return array_unique($matches[1]);
}

// 3. 下載並保存圖片 (核心)
function GrabImage($url, $saveDir = 'download/') {
    if (empty($url)) return false;

    // 確保目錄存在
    if (!is_dir($saveDir)) mkdir($saveDir, 0755, true);

    // 確定文件名
    $parsed = parse_url($url);
    $basename = basename($parsed['path']);
    $ext = strtolower(pathinfo($basename, PATHINFO_EXTENSION));
    if (!in_array($ext, ['jpg','jpeg','png','gif','webp','bmp'])) {
        $ext = 'jpg'; // 默認
    }
    $filename = $saveDir . date('YmdHis') . '_' . random_int(1000,9999) . ".$ext";

    // 下載 (cURL 支持大文件、重定向、HTTPS)
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_TIMEOUT => 60,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_RANGE => '0-20971520', // 限制 20MB 防止巨大文件
    ]);
    $imgData = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
    curl_close($ch);

    // 驗證
    if ($httpCode !== 200 || empty($imgData)) return false;
    if (!preg_match('/^image\//', $contentType)) return false; // 確保是圖片

    // 保存
    $fp = fopen($filename, 'wb');
    fwrite($fp, $imgData);
    fclose($fp);

    return $filename;
}

// 4. 主流程
$targetUrl = 'https://www.jb51.net'; // 可改為 $_GET['url'] 並驗證
$html = read_url($targetUrl);
$imageUrls = extract_image_urls($html);

echo "共發現 " . count($imageUrls) . " 張圖片<br>";
foreach ($imageUrls as $imgUrl) {
    // 處理相對路徑
    if (strpos($imgUrl, 'http') !== 0) {
        $imgUrl = rtrim($targetUrl, '/') . '/' . ltrim($imgUrl, '/');
    }
    $saved = GrabImage($imgUrl);
    echo $saved ? "✅ $imgUrl → $saved<br>" : "❌ $imgUrl 下載失敗<br>";
    flush(); // 實時輸出
}
?>

關鍵增強點 (對比原代碼)

功能原代碼增強版
HTTP 客戶端fopen/fread (無超時、無重定向、無 HTTPS)cURL (完整支持)
正則提取簡單,易漏匹配兼容單雙引號、無引號、屬性順序
相對路徑處理無自動補全為絕對 URL
文件命名僅時間戳時間戳 + 隨機數 + 原擴展名/驗證後擴展名
內容驗證無HTTP 200 + Content-Type image/* + 大小限制
錯誤處理無逐個捕獲、記錄、繼續
內存控制讀入變量cURL 直接寫文件句柄 (大文件建議 CURLOPT_WRITEFUNCTION)

進階擴展建議

  • 去重:按文件哈希 (MD5/SHA256) 去重,避免同圖不同 URL 重複下載。
  • 並發下載:curl_multi_* 或 GuzzleHttp\Pool 並發 10-50 個連接。
  • 增量采集:記錄已采集 URL (資料庫/Redis),下次跳過。
  • 縮略圖生成:下載後調用 resize_image() 生成多規格縮略圖。
  • 版權合規:檢查 robots.txt、X-Robots-Tag、站點聲明,尊重爬蟲協議。

從簡單腳本到健壯采集器,關鍵在於:異步 HTTP、結構化解析、持久化狀態、合規邊界。

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