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

PHP 采集百度貼吧指定相冊圖片完整腳本(含防盜鏈處理)

     編輯:PHP 相關知識

百度貼吧相冊圖片帶有防盜鏈,直接外鏈會返回 403。本文提供完整 PHP 采集腳本:調用貼吧相冊 API 獲取圖片列表,下載至本地服務器,自動處理命名衝突、目錄創建、錯誤重試,可直接用於內容遷移、備份、離線閱讀。

核心流程

  1. 構造相冊 API 請求 URL(需貼吧名 kw、相冊 ID tid)
  2. 獲取 JSON 響應,解析 data.pic_list 圖片數組
  3. 遍歷下載每張圖片原圖(imgsrc.baidu.com 域名)
  4. 本地保存:以 圖片ID.jpg 命名,按相冊 ID 分目錄

完整可運行腳本

<?php
// ================= 配置區 =================
$tbName   = 'mugen';           // 貼吧名稱
$tid      = '2124904411';      // 相冊 ID
$saveRoot = 'R:/images/';      // 本地存儲根目錄(需寫入權限)
$apiTpl   = 'https://tieba.baidu.com/photo/bw/picture/guide?kw=%s&tid=%s';
$imgTpl   = 'https://imgsrc.baidu.com/forum/pic/item/%s.jpg';
// ========================================

set_time_limit(300); // 5 分鐘超時,防止大量圖片中斷

$apiUrl = sprintf($apiTpl, urlencode($tbName), $tid);
$json   = @file_get_contents($apiUrl);
if (!$json) die("API 請求失敗: $apiUrl\n");

$data = json_decode($json, true);
if (empty($data['data']['pic_list'])) die("無圖片數據或 API 變更\n");

$picList = $data['data']['pic_list'];
$saveDir = $saveRoot . $tid;
if (!is_dir($saveDir)) {
    if (!mkdir($saveDir, 0755, true)) die("創建目錄失敗: $saveDir\n");
}

$success = $fail = 0;
foreach ($picList as $pic) {
    $picId = $pic['img']['original']['id'] ?? '';
    if (!$picId) { $fail++; continue; }

    $imgUrl  = sprintf($imgTpl, $picId);
    $savePath = $saveDir . '/' . $picId . '.jpg';

    // 跳過已存在
    if (file_exists($savePath)) {
        echo "已存在跳過: $picId.jpg\n";
        continue;
    }

    // 下載帶重試
    $content = '';
    for ($retry = 3; $retry > 0; $retry--) {
        $content = @file_get_contents($imgUrl);
        if ($content !== false && strlen($content) > 100) break; // 簡單有效性判斷
        sleep(1);
    }

    if ($content === false || strlen($content) <= 100) {
        echo "下載失敗: $imgUrl\n";
        $fail++;
        continue;
    }

    if (file_put_contents($savePath, $content) !== false) {
        echo "成功保存: $savePath\n";
        $success++;
    } else {
        echo "寫入失敗: $savePath\n";
        $fail++;
    }
}

echo "\n=== 采集完成 ===\n成功: $success  失敗: $fail\n";
?>

關鍵技術點解析

環節處理方式原因
API 請求urlencode($tbName)貼吧名可能含中文/特殊字符
防盜鏈繞過服務端下載(file_get_contents)服務器 IP 通常不在防盜鏈黑名單
大文件/超時set_time_limit(300) + 分批運行避免腳本執行超時中斷
斷點續傳file_exists($savePath) 跳過中斷後重跑不重複下載
重試機制3 次重試 + sleep(1)應對網絡抖動、CDN 節點暫時不可用
內容校驗strlen($content) > 100過濾 403/404 錯誤頁面的小體積響應

擴展建議

  • 並發下載:用 curl_multi 或 Swoole 協程並發,大幅提速
  • 增量采集:記錄 tid 與最新 pic_id,定時任務只抓新增
  • 圖片去重:計算 MD5/感知哈希,避免不同相冊重複圖片
  • 元數據入庫:將 pic_id、原始 URL、標題、時間存入數據庫,構建圖片資產庫
  • 合規提示:遵守 robots.txt、用戶協議,僅用於個人備份/學習,勿商業分發
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved