百度貼吧相冊圖片帶有防盜鏈,直接外鏈會返回 403。本文提供完整 PHP 采集腳本:調用貼吧相冊 API 獲取圖片列表,下載至本地服務器,自動處理命名衝突、目錄創建、錯誤重試,可直接用於內容遷移、備份、離線閱讀。
kw、相冊 ID tid)data.pic_list 圖片數組imgsrc.baidu.com 域名)圖片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,定時任務只抓新增pic_id、原始 URL、標題、時間存入數據庫,構建圖片資產庫robots.txt、用戶協議,僅用於個人備份/學習,勿商業分發