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

PHP 遠程采集防盜鏈圖片完整教程:從單張到批量下載

     編輯:PHP 綜合知識

業務痛點

采集頁面時,目標站圖片若有防盜鏈,直接引用會失效。需將圖片下載至本地服務器,再替換頁面中的圖片路徑。

核心流程

  1. 獲取目標圖片 URL
  2. 讀取圖片二進制內容
  3. 創建本地存儲目錄
  4. 寫入文件
  5. 返回本地路徑

模組化函數實現

1. 目錄創建 make_dir()

function make_dir($path) {
    if (!file_exists($path)) {
        @mkdir($path, 0777, true);  // 遞歸創建
        @chmod($path, 0777);
    }
    return true;
}

2. 讀取文件內容 read_filetext()

function read_filetext($filepath) {
    $filepath = trim($filepath);
    $fp = @fopen($filepath, 'rb');
    if (!$fp) return '';

    $content = '';
    if (strstr($filepath, '://')) {
        // 遠程流式讀取
        while ($data = @fread($fp, 8192)) {
            $content .= $data;
        }
    } else {
        // 本地一次性讀取
        $content = @fread($fp, @filesize($filepath));
    }
    @fclose($fp);
    return $content;
}

3. 寫入文件 write_filetext()

function write_filetext($filepath, $string) {
    $fp = @fopen($filepath, 'wb');
    if ($fp) {
        @fwrite($fp, $string);
        @fclose($fp);
    }
}

4. 解析文件名 get_filename()

function get_filename($filepath) {
    $parts = explode('/', $filepath);
    return end($parts);
}

5. 綜合下載函數 save_pic()

function save_pic($url, $savepath = '') {
    $url = trim($url);
    $url = str_replace(' ', '%20', $url);

    $content = read_filetext($url);
    if (empty($content)) {
        return false; // 或拋出異常
    }

    $filename = get_filename($url);
    make_dir($savepath);
    $filepath = $savepath . $filename;

    write_filetext($filepath, $content);
    return $filepath;
}

批量采集入口 get_pic()

function get_pic($html, $savepath) {
    // 匹配 img 標簽 src 屬性(簡化版,實際建議用 DOMDocument)
    $pattern = '/<img[^>]+src=["\']([^"\']+\.(?:gif|jpg|jpeg|png|webp))["\']/i';
    preg_match_all($pattern, $html, $matches);
    $urls = $matches[1];

    foreach ($urls as $url) {
        $result = save_pic($url, $savepath);
        echo $result ? "[OK] $url\n" : "[FAIL] $url\n";
    }
}

實戰測試:采集太平洋電腦網文章圖片

$url = 'https://gz.pconline.com.cn/321/3215791.html';
$html = file_get_contents($url);

// 提取正文區域(根據目標站結構調整)
$preg = '#<div class="art_con">(.*)<div class="ivy620"></div>#isU';
preg_match_all($preg, $html, $arr);
$content = $arr[1][0] ?? '';

get_pic($content, 'img/');

進階優化方向

  • 反防盜鏈:設置 Referer、User-Agent、Cookie 模擬瀏覽器
  • 異步下載:cURL 多線程、Swoole、Guzzle 併發
  • 去重存儲:MD5 命名、數據庫記錄 URL 映射
  • 異常處理:超時重試、302 跳轉跟隨、大文件分片
  • 合規性:遵守 robots.txt、限制頻率、授權使用

總結

基於 fopen/fread/fwrite 的流式讀寫可避免大圖內存溢出,模組化設計便於擴展。實際項目中建議引入成熟 HTTP 客戶端(Guzzle)與 DOM 解析器(DOMDocument/QueryList)提升穩健性。

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