遇到套圖、壁紙站、QQ 相冊需批量下載幾百張圖片,手動右鍵「另存為」效率極低。Windows 下有 DownloadThemAll + 迅雷組合,但遷移到 Linux (Ubuntu) + Chrome 後缺乏現成工具。
| 環節 | 方案 | 關鍵點 |
|---|---|---|
| 獲取圖片鏈接 | Chrome DevTools Console 執行 jQuery 腳本 | 區分縮略圖 a>img 與原圖 img,提取 href 或 src |
| 篩選有效圖片 | JS new Image() 預載寬高判斷 | 過濾 logo/icon 等小圖,保留大圖 |
| 跨域傳遞鏈接 | 本地部署 CodeIgniter 接口 $.getJSON() JSONP | 將鏈接寫入 urls.txt,繞過瀏覽器下載限制 |
| 高性能下載 | wget -i -b urls.txt 後台並發下載 | 支持斷點續傳、限速、遞歸鏡像 |
// 1. 載入 jQuery (若頁面無)
var s=document.createElement('script');
s.src='https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js';
document.head.appendChild(s);
// 2. 等待載入後提取
setTimeout(function(){
var urls = [];
$('a[href]').each(function(){
var href = $(this).attr('href');
if (/\.(jpe?g|png|gif|webp)$/i.test(href)) urls.push(href);
});
$('img[src]').each(function(){
var src = $(this).attr('src');
if (/\.(jpe?g|png|gif|webp)$/i.test(src)) urls.push(src);
});
// 去重
urls = [...new Set(urls)];
console.log('共找到', urls.length, '張圖片');
console.log(urls.join('\n'));
// 3. 發送到本地接口 (需配置 CORS 或 JSONP)
$.getJSON('https://localhost/api/save_urls?callback=?', {urls: urls}, function(r){
console.log('服務端響應:', r);
});
}, 2000);
<?php // application/controllers/Api.php
class Api extends CI_Controller {
public function save_urls() {
$urls = $this->input->get('urls');
if (is_array($urls) && $urls) {
file_put_contents(FCPATH . 'urls.txt', implode("\n", $urls) . "\n", FILE_APPEND);
$this->output->set_content_type('application/json')->set_output(json_encode(['status'=>1, 'count'=>count($urls)]));
} else {
$this->output->set_status_header(400)->set_output(json_encode(['status'=>0, 'msg'=>'empty']));
}
}
}
cd /var/www/html/your_project # 進入 urls.txt 所在目錄
wget -i urls.txt -b -c --limit-rate=2m -P ./downloads
# -i 從文件讀取 URL
# -b 後台運行
# -c 斷點續傳
# --limit-rate 限速避免佔滿帶寬
# -P 指定保存目錄
src="/img/a.jpg" 需補全域名 new URL(src, location.origin).href。wget --referer="https://target.site/" -i urls.txt。wget --load-cookies=cookies.txt -i urls.txt (先從瀏覽器導出 cookies.txt)。find . -size -10k -delete 清理無效縮略圖。robots.txt 與版權。chrome.downloads.download() API,省去本地服務 + wget 環節。curl_multi 或 Guzzle 異步下載,寫入服務器磁盤,再打包 ZIP 供前端下載。「Console 提取 → 本地接口存儲 → wget 下載」雖顯笨拙,但零依賴、跨平台、可控性強。通過不斷拆解問題、嘗試替代方案,最終形成適合自己工作流的工具鏈,這才是工程師成長的核心價值。