目標頁面 (瀏覽器)
→ F12 Console / Tampermonkey 腳本
→ 提取 JSON 數據 (DOM 解析 / 接口攔截)
→ AJAX POST 到自建後端 API
→ Controller 接收 → Service 處理 → DAO 入庫
→ 返回結果 → 前端展示/日誌
| 路徑 | 適用場景 | 核心代碼 |
|---|---|---|
| DOM 解析 | 數據直接渲染在 HTML 結構中 | $$('selector').map(el => el.innerText) |
| 接口攔截 (XHR/fetch) | 數據通過 AJAX 動態加載 | fetch(url).then(r=>r.json()) 或攔截 XMLHttpRequest |
// Tampermonkey / Console 通用
(async () => {
// 1. 獲取數據 (示例:攔截某接口)
const response = await fetch('/api/data/list?page=1', { credentials: 'include' });
const { data } = await response.json(); // 假設返回 {data: [...]}
// 2. 過濾/轉換
const payload = data.map(item => ({
id: item.id,
name: item.name,
value: item.value
}));
// 3. 發送到後端入庫 API
const res = await fetch('https://localhost:8080/api/collect', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
const result = await res.json();
console.log('入庫結果:', result);
})();
@RestController
@RequestMapping("/api/collect")
public class CollectController {
@Autowired private CollectService service;
@PostMapping
public Result collect(@RequestBody List list) {
return service.batchSave(list);
}
}
@Service
public class CollectService {
@Autowired private DataRepository repo;
@Transactional
public Result batchSave(List list) {
List entities = list.stream()
.map(dto -> new DataEntity(dto.getId(), dto.getName(), dto.getValue()))
.collect(Collectors.toList());
repo.saveAll(entities);
return Result.ok("成功入庫 " + entities.size() + " 條");
}
}
ON DUPLICATE KEY UPDATE。若目標頁面重度依賴 JS 渲染,使用 Puppeteer / Playwright / Selenium 運行無頭瀏覽器,模擬真實用戶行為獲取數據,再走相同入庫鏈路。
構建「前端提取 → 後端入庫」標準化管道,將零散頁面數據轉化為結構化資產。