🔥
BOOM ORACLE · SCC TUTORIAL
← Boom Tools
SCC Docs
📡 Scrapers Tutorial
SCC Scrapers Tutorial
คู่มือใช้งาน Scraper Command Center — ระบบดึงข้อมูลอสังหาริมทรัพย์อัตโนมัติ 16 scrapers, 11 NPA banks, 99,112+ listings พร้อม AI pipeline
01 · INTRODUCTION
Scraper คืออะไร? — ระบบดึงข้อมูลอัตโนมัติ
Scraper คือโปรแกรมที่ดึงข้อมูลจากเว็บไซต์อสังหาริมทรัพย์โดยอัตโนมัติ แต่ละตัวทำงานใน Docker container แยกกัน ควบคุมและจัดการทั้งหมดผ่าน SCC (Scraper Command Center)
🤖
อัตโนมัติ 100%
FULLY AUTOMATED
Scraper ทำงานตาม schedule โดยไม่ต้องสั่งเอง ดึงข้อมูลจากเว็บไซต์ธนาคาร NPA และแพลตฟอร์มอสังหาฯ ทุกวันอัตโนมัติ
🐳
Docker Container
ISOLATED ENVIRONMENT
แต่ละ scraper รันใน Docker container ของตัวเอง แยกจากกัน ถ้า scraper ตัวหนึ่งล้มเหลว ไม่กระทบตัวอื่น
🎛️
SCC Dashboard
COMMAND CENTER
จัดการ scraper ทั้งหมดผ่าน web dashboard ที่ localhost:3030/scrapers ดูสถานะ สั่งรัน และตรวจสอบผลลัพธ์ได้ในที่เดียว
🧠
AI Pipeline
CLAUDE POWERED
ข้อมูล raw ที่ดึงมาจะถูก Claude AI ประมวลผลอัตโนมัติ ทำความสะอาดข้อมูล สรุป และสร้าง SEO content ก่อน publish
PIPELINE FLOW
ขั้นตอนการทำงานตั้งแต่ต้นจนถึง homes.kanawut.com
หลักการทำงาน: ระบบดึงข้อมูลจากเว็บไซต์ธนาคาร NPA และแพลตฟอร์มอสังหาฯ → เก็บเป็น raw data ใน PostgreSQL → ผ่าน AI pipeline ที่ใช้ Claude CLI ทำความสะอาดและสรุปข้อมูล → ทีมงาน review และ approve → publish ขึ้น homes.kanawut.com โดยอัตโนมัติ ทั้งหมดนี้จัดการผ่าน SCC dashboard
02 · FLEET OVERVIEW
Scraper Fleet — ภาพรวมทั้ง 16 ตัว
ระบบมี scraper ทั้งหมด 16 ตัว แบ่งเป็น 3 กลุ่ม: NPA Banks (ทรัพย์สินรอขายธนาคาร), Listing Sites (แพลตฟอร์มอสังหาฯ), และ Review & Content (รีวิวโครงการและข่าวสาร)
■ NPA BANKS — ทรัพย์สินรอขายธนาคาร (11 ตัว)
NPA
npa-bam
BAM
15,891 listings
บริษัทบริหารสินทรัพย์กรุงเทพพาณิชย์ — ทรัพย์ NPL จากธนาคารพาณิชย์ ครอบคลุมทั่วประเทศ
NPA
npa-ghb
GHB
25,163 listings
ธนาคารอาคารสงเคราะห์ — ฐานข้อมูลใหญ่ที่สุดในระบบ เน้นที่อยู่อาศัยราคาประหยัดถึงกลาง
NPA
npa-gsb
GSB
6,135 listings
ธนาคารออมสิน — ทรัพย์รอขายประเภทที่ดินและอาคารพาณิชย์เป็นหลัก
NPA
npa-kbank
KBank
14,303 listings
ธนาคารกสิกรไทย — ทรัพย์ NPA ครบทุกประเภท บ้าน คอนโด ที่ดิน อาคารพาณิชย์
NPA
npa-kkpfg
KKPFG
1,791 listings
เกียรตินาคินภัทร — ทรัพย์จากธนาคารและบริษัทในเครือ ส่วนใหญ่เป็นอสังหาฯ เชิงพาณิชย์
NPA
npa-krungsri
Krungsri
1,723 listings
ธนาคารกรุงศรีอยุธยา — ทรัพย์ NPA ในราคาตลาดที่น่าสนใจ กระจายทั่วภาคต่าง ๆ
NPA
npa-krungthai
Krungthai
2,957 listings
ธนาคารกรุงไทย — ทรัพย์ NPA ครบทุกจังหวัด เน้นที่อยู่อาศัยและที่ดินเกษตรกรรม
NPA
npa-sam
SAM
4,874 listings
บริษัทบริหารสินทรัพย์สุขุมวิท — เน้นสินทรัพย์คุณภาพดีจาก FIDF ราคาเริ่มต้นสูง
NPA
npa-scb
SCB
3,845 listings
ธนาคารไทยพาณิชย์ — ทรัพย์ NPA คุณภาพดี ราคาตลาด ทั้งที่อยู่อาศัยและเชิงพาณิชย์
NPA
npa-swpamc
SWPAMC
1,655 listings
บริษัทบริหารสินทรัพย์ศรีวิทย์ — สินทรัพย์ NPL เฉพาะทาง ราคาต่ำกว่าตลาด
■ LISTING SITES — แพลตฟอร์มอสังหาริมทรัพย์ (2 ตัว)
LISTING
npa-livinginsider
LivingInsider
20,775 listings
แพลตฟอร์มซื้อ-ขาย-เช่าอสังหาริมทรัพย์ไทย ครอบคลุมทั้งโครงการใหม่และมือสอง ข้อมูลอัปเดตสม่ำเสมอ
LISTING
npa-ddproperty
DDProperty
— protected
แพลตฟอร์มอสังหาฯ ขนาดใหญ่ — ปัจจุบันถูกป้องกันด้วย Cloudflare ระบบ scrape ยังอยู่ระหว่างพัฒนา bypass method
■ REVIEW & CONTENT — รีวิวและข่าวสาร (4 ตัว)
CONTENT
home-coth
home.co.th
6,760 โครงการ
ดึงรีวิวโครงการและข้อมูลโครงการอสังหาฯ จาก home.co.th ครบทั้งโครงการบ้านเดี่ยว ทาวน์เฮ้าส์ และคอนโด
CONTENT
home-coth-scanner
home.co.th Scanner
AUTO discovery
ค้นหา URL โครงการใหม่จาก home.co.th โดยอัตโนมัติ ส่งให้ home-coth scraper ดึงข้อมูลต่อ ทำงานเป็นรอบ
CONTENT
fb-page
Facebook
SOCIAL feed
ดึงโพสต์จาก Facebook Pages ของโครงการอสังหาฯ และตัวแทนขาย ใช้เป็นข้อมูลเสริมและติดตามข่าวสาร
CONTENT
rss-feed
RSS/Atom Feed
NEWS aggregator
ดึงข่าวจาก RSS feeds ของเว็บไซต์อสังหาฯ ชั้นนำ เช่น ThinkOfLiving, TerraBKK, PostToday Property ฯลฯ
รวมทั้งหมด: 16 scrapers — NPA Banks 10 ตัว + Listing Sites 2 ตัว + Review & Content 4 ตัว | ข้อมูลรวม 99,112+ listings ใน database | GHB มีข้อมูลมากที่สุด (25,163 listings) รองลงมา BAM (15,891) และ KBank (14,303)
03 · SCRAPERS PAGE UI
หน้า Scrapers — มีอะไรบ้าง?
หน้า /scrapers คือ command center หลักสำหรับจัดการ scraper ทั้งหมด เข้าถึงได้ที่ http://localhost:3030/scrapers ประกอบด้วย 3 ส่วนหลัก
ส่วนที่ 1 — HEADER KPIs (5 ตัวชี้วัด)
📋
847
Total Jobs (24h)
จำนวน jobs ที่รันใน 24 ชั่วโมงที่ผ่านมา
✅
98.2%
Success Rate
เปอร์เซ็นต์ jobs ที่สำเร็จ — ถ้าต่ำกว่า 95% ให้ตรวจสอบ
⏱️
4.2m
Avg Duration
เวลาเฉลี่ยต่อ job — ถ้านานเกินปกติให้ตรวจ timeout
🟢
3
Active Now
จำนวน scraper ที่กำลังทำงานอยู่ตอนนี้
🔗
4,312
URLs Tracked
จำนวน URL ที่ระบบติดตามและดึงข้อมูลอยู่
ส่วนที่ 2 — SCRAPER CARDS
แต่ละ scraper แสดงเป็น card พร้อมข้อมูลสำคัญ ตัวอย่าง card ของ BAM scraper:
สิ่งที่แสดงใน scraper card:
ชื่อ scraper + Docker image — ชื่อเต็มและ image ที่ใช้รัน
Status pill — สีเขียว IDLE (พร้อมใช้), สีน้ำเงิน RUN (กำลังทำงาน), สีแดง ERROR (ล้มเหลว), สีเทา PAUSED (ปิดชั่วคราว)
Jobs Today — จำนวน jobs ที่รันวันนี้
Success rate — อัตราสำเร็จ ถ้าต่ำกว่า 90% ให้ตรวจสอบ
Last Run — ครั้งสุดท้ายที่รัน นานเกินไปอาจหมายความว่า schedule ผิดปกติ
ปุ่ม Details — กดเพื่อดูรายละเอียด jobs, logs, และ settings
ส่วนที่ 3 — STATUS PILLS
IDLE
พร้อมใช้งาน
Scraper ว่างอยู่ พร้อมรับ job ใหม่ได้ทันที ไม่มีปัญหา
RUN
กำลังทำงาน
Scraper กำลังดึงข้อมูลอยู่ ห้ามหยุดกลางคัน รอให้เสร็จก่อน
ERROR
เกิดข้อผิดพลาด
Job ล่าสุดล้มเหลว กด Details เพื่อดู error log และวินิจฉัยปัญหา
PAUSED
ปิดชั่วคราว
Scraper ถูก disable ไว้ ไม่รับ job ใหม่ ต้องเปิดใช้งานเอง
04 · HOW TO USE
วิธีใช้งาน — Step-by-Step Guide
ขั้นตอนการใช้งาน SCC scrapers ตั้งแต่การดูสถานะ fleet สั่ง scrape ดูผลลัพธ์ ติดตาม pipeline จนถึงการ review และ publish ขึ้น homes.kanawut.com
1
ดูสถานะ Fleet
เปิด browser ไปที่ http://localhost:3030/scrapers
ดู KPIs ด้านบน — ถ้า Success Rate ต่ำกว่า 95% ให้ตรวจสอบทันที
สแกน scraper cards — สีเขียว (IDLE) = ปกติ, สีแดง (ERROR) = มีปัญหา
ดู Active Now — ถ้ามีตัวที่ RUN นานผิดปกติ อาจ timeout
ดู Last Run — scraper ไหนไม่ได้รันนานเกินกำหนดให้ตรวจสอบ schedule
curl http://localhost:3011/scrapers
curl http://localhost:3011/health
2
สั่ง Scrape (ดึงข้อมูล)
มี 2 วิธีในการสั่ง scrape:
วิธีที่ 1 — ผ่าน Dashboard: ไปที่หน้า URLs → เลือก URL ที่ต้องการ → กดปุ่ม "Scrape Now"
วิธีที่ 2 — ผ่าน API: ส่ง POST request ตามด้านล่าง
curl -X POST http://localhost:3011/urls/scrape-now \
-H "Content-Type: application/json" \
-d '{"scraperId":"npa-bam","url":"https://bam-els-sync-api-prd.bam.co.th/api/v1/properties"}'
curl -X POST http://localhost:3011/urls/scrape-now \
-H "Content-Type: application/json" \
-d '{"scraperId":"npa-ghb","url":"https://www.ghbank.co.th/npa"}'
3
ดูผลลัพธ์ Jobs
หลังสั่ง scrape ไปแล้ว ติดตามสถานะผ่านหน้า Jobs
ไปที่ http://localhost:3030/jobs
สถานะ job ไหลไปตามลำดับ: queued → running → ok หรือ failed
กดดู job detail เพื่อเห็น raw output, duration, errors และ stack trace
Job ที่ failed จะแสดง error message และสามารถ retry ได้
curl "http://localhost:3011/jobs?limit=10"
curl "http://localhost:3011/jobs?scraperId=npa-bam&limit=5"
curl "http://localhost:3011/jobs?status=failed&limit=10"
4
ดู Pipeline
หลัง scrape สำเร็จ ข้อมูลจะเข้า pipeline อัตโนมัติ ไม่ต้องสั่งเอง
Pipeline ทำงาน: raw data → AI Clean → AI Summary → ready for review
ดูสถานะ pipeline ที่ http://localhost:3030/pipeline
แต่ละ stage ใช้ Claude CLI ประมวลผล — อาจใช้เวลาขึ้นอยู่กับปริมาณข้อมูล
property ที่ AI ประมวลผลเสร็จแล้วจะเข้าสู่ Review queue
curl http://localhost:3011/pipelines
curl "http://localhost:3011/pipelines?status=active"
5
Review & Publish
ขั้นสุดท้ายก่อน property จะขึ้น homes.kanawut.com
ไปที่ http://localhost:3030/review เพื่อดู property ที่ AI ทำเสร็จแล้ว
Approve — property จะเข้าระบบ homes.kanawut.com ทันที
Reject — property จะถูกลบออกจาก queue ไม่ publish
ตรวจสอบข้อมูลที่ AI สรุปมา เช่น ราคา ที่ตั้ง ประเภท ก่อน approve
Publisher จัดการ sync ข้อมูลไปยัง homes DB (PostGIS port 5437)
เคล็ดลับ: AI จะสรุป property description เป็นภาษาไทยที่อ่านง่าย พร้อม SEO metadata ตรวจสอบว่าข้อมูลถูกต้องก่อน approve เสมอ โดยเฉพาะราคาและที่ตั้ง
05 · ARCHITECTURE
สถาปัตยกรรมระบบ — SCC System Design
SCC ออกแบบแบบ microservice โดยมี Next.js เป็น UI, Fastify เป็น REST API, PostgreSQL เป็น primary DB, Redis เป็น job queue, BullMQ เป็น worker processor และ Docker containers สำหรับ scrapers
┌──── SCC Command Center ──────────────────────────────────────────────┐
│ │
│ UI (Next.js :3030) ←→ API (Fastify :3011) │
│ ↕ ↕ │
│ Postgres (:5436) Redis (:6380) │
│ │
│ ↕ ↕ │
│ Worker Agent Docker Containers │
│ │
│ ↕ │
│ AI Pipeline (Claude CLI) │
│ │
│ ↕ │
│ Publisher │
│ │
│ ↕ │
│ Homes DB (PostGIS :5435) │
│ │
└────────────────────────────────────────────────────────────────────┘
COMPONENTS
⚡
Next.js UI (:3030)
FRONTEND DASHBOARD
Dashboard หลักสำหรับ monitor scrapers, jobs, pipeline และ review property ก่อน publish รองรับ real-time updates
🚀
Fastify API (:3011)
REST API BACKEND
REST API สำหรับ scrapers, jobs, URLs, pipelines และ publisher TypeScript + Fastify เร็วและ lightweight
🗄️
PostgreSQL (:5436)
SCC DATABASE
Database หลักของ SCC เก็บ scrapers config, jobs history, URLs, raw data และ pipeline results ใช้ Drizzle ORM
⚡
Redis (:6380)
JOB QUEUE
BullMQ job queue — รับ scrape jobs จาก API ส่งให้ Worker ประมวลผล รองรับ retry, priority และ delayed jobs
🔧
Worker Agent
JOB PROCESSOR
BullMQ Worker ที่รัน scraper Docker containers รับ jobs จาก Redis queue ส่ง status กลับ เก็บ logs ใน Postgres
🧠
AI Pipeline
CLAUDE CLI
ใช้ Claude CLI ประมวลผล raw data ทำความสะอาด normalize และสร้าง SEO description ภาษาไทยอัตโนมัติ
🏠
PostGIS (:5435)
HOMES DATABASE
Database สำหรับ homes.kanawut.com รองรับ GIS/spatial queries ค้นหาอสังหาฯ ตาม location ได้แม่นยำ
DATA FLOW
ขั้นตอน
Component
Input
Output
สถานะ
01 · TRIGGER
API / Scheduler
scraper ID + URL
Job ID ใน Redis queue
อัตโนมัติ
02 · SCRAPE
Worker + Docker
URL target
Raw JSON/HTML data
Docker
03 · STORE
PostgreSQL
Raw data
raw_properties table
อัตโนมัติ
04 · AI CLEAN
Claude CLI
Raw property data
Normalized JSON
AI
05 · AI SUMMARY
Claude CLI
Normalized data
SEO description (Thai)
AI
06 · REVIEW
SCC Dashboard
AI-processed property
Approved / Rejected
Manual
07 · PUBLISH
Publisher → PostGIS
Approved property
Live on homes.kanawut.com
อัตโนมัติ
06 · SERVICE PORTS
Service Ports — ตารางพอร์ตทั้งหมด
SCC ใช้หลาย services พร้อมกัน แต่ละ service รันบน port ที่แตกต่างกัน รู้ port ถูกต้องช่วยให้ debug และ connect ได้เร็วขึ้น
Port
Service
Tech Stack
คำอธิบาย
สถานะ
3011
SCC API
Fastify + TypeScript
REST API หลักสำหรับ scrapers, jobs, URLs, pipelines ทุก endpoint ใช้ port นี้
Core
3030
SCC UI
Next.js + React
Dashboard หลัก เปิดใน browser เพื่อจัดการระบบ scraper, job monitoring, review
Core
5436
scc-postgres-boot
PostgreSQL + Drizzle
Database หลักของ SCC เก็บ scraper configs, jobs, raw data, pipeline results ทั้งหมด
Core
5435
scc-homes-pg
PostgreSQL + PostGIS
Database สำหรับ homes.kanawut.com รองรับ spatial/GIS queries เก็บ property listings ที่ approved
Core
6380
scc-redis
Redis + BullMQ
Job queue ระหว่าง API กับ Worker รับ scrape jobs จาก API ส่งให้ Worker ดำเนินการ
Core
วิธีตรวจสอบว่า services ทำงานหรือไม่:
เปิด terminal แล้วรัน docker ps เพื่อดู containers ทั้งหมดที่กำลังรัน หรือรัน curl http://localhost:3011/health เพื่อตรวจสอบ API ถ้า response เป็น {"status":"ok"} แสดงว่า API ทำงานปกติ
DOCKER COMMANDS
docker ps
docker ps --filter name=scc
docker start scc-postgres-boot
docker start scc-redis
docker start scc-homes-pg
docker logs scc-postgres-boot --tail 50
docker logs scc-redis --tail 20
07 · QUICK REFERENCE
คำสั่งที่ใช้บ่อย — Quick Reference
รวมคำสั่ง curl และ bash ที่ใช้บ่อยในการจัดการ SCC แบ่งตาม category เพื่อหาได้ง่าย คัดลอกและใช้ได้เลย
curl http://localhost:3011/health
curl http://localhost:3011/scrapers
docker exec scc-redis redis-cli ping
curl "http://localhost:3011/jobs?limit=10"
curl "http://localhost:3011/jobs?status=failed"
curl "http://localhost:3011/jobs?scraperId=npa-bam"
curl -X POST http://localhost:3011/urls/scrape-now \
-H "Content-Type: application/json" \
-d '{"scraperId":"npa-bam","url":"https://..."}'
curl -X POST http://localhost:3011/urls/scrape-now \
-H "Content-Type: application/json" \
-d '{"scraperId":"npa-ghb","url":"https://..."}'
curl http://localhost:3011/pipelines
curl "http://localhost:3011/pipelines?status=active"
curl "http://localhost:3011/pipelines?status=done"
curl http://localhost:3011/urls
curl "http://localhost:3011/urls?scraperId=npa-bam"
curl "http://localhost:3011/urls/stats"
bash scripts/startup.sh
cd worker && bun run dev
cd api && bun run dev
cd ui && bun run dev
psql -h localhost -p 5436 -U postgres scc_boot
docker exec scc-postgres-boot psql -U postgres \
-c "SELECT scraper_id, COUNT(*) FROM raw_properties GROUP BY scraper_id;"
psql -h localhost -p 5435 -U postgres homes
docker logs scc-api --tail 100 -f
docker logs scc-worker --tail 50
docker logs scc-postgres-boot --tail 30
08 · TROUBLESHOOTING
แก้ปัญหา — Troubleshooting Guide
ปัญหาที่พบบ่อยในการใช้งาน SCC พร้อมสาเหตุและวิธีแก้ไข ถ้าไม่พบปัญหาของคุณในนี้ ให้ดู logs ของ service ที่เกี่ยวข้อง
🔴 API 500 — ECONNREFUSED
สาเหตุ: Postgres ไม่ทำงาน หรือ connection string ผิด
docker start scc-postgres-boot curl http://localhost:3011/health
🔴 Jobs ไม่ process — queue ค้าง
สาเหตุ: Worker offline หรือ Redis ไม่ทำงาน
cd worker && bun run dev docker start scc-redis
🔴 Redis connection refused
สาเหตุ: Redis container หยุดทำงาน หรือ port 6380 ถูก block
docker start scc-redis docker exec scc-redis redis-cli ping
🟡 Scraper failed — Docker error
สาเหตุ: Docker image ไม่มี หรือ build ไม่สำเร็จ
bun run build:scraper:npa-bam docker images | grep scraper
🟡 Login ไม่ได้ — auth.js block
สาเหตุ: ใส่ password ผิด หรือ auth.js ไม่โหลด
ใช้ password: boom2026 ตรวจสอบ auth.js โหลดใน browser console
🟡 AI Pipeline ไม่ทำงาน
สาเหตุ: Claude CLI ไม่ได้ login หรือ API key หมด
claude --version claude auth login
🟡 UI แสดง "Cannot connect to API"
สาเหตุ: SCC API (:3011) ไม่รัน หรือ CORS error
cd api && bun run dev curl http://localhost:3011/health
🟡 Homes DB ไม่ sync
สาเหตุ: scc-homes-pg container ไม่รัน หรือ port 5435 ปิด
docker start scc-homes-pg psql -h localhost -p 5435 -U postgres homes
🔵 Scraper ช้าผิดปกติ
สาเหตุ: เว็บต้นทาง rate limit หรือ Docker resource ไม่พอ
ดู job duration ใน dashboard docker stats | grep scraper
🔵 DDProperty ไม่มีข้อมูล
สาเหตุ: Cloudflare protection บล็อก scraper
ปัญหานี้ทราบอยู่แล้ว อยู่ระหว่างพัฒนา bypass method
🔵 Drizzle migration error
สาเหตุ: Schema ไม่ sync กับ database ต้องรัน migration
cd api && bun run db:migrate bun run db:push
🔵 บันทึก Error ไม่ได้
สาเหตุ: Disk เต็ม หรือ volume mount ผิด
df -h docker system df docker system prune
EMERGENCY RESTART
docker stop scc-postgres-boot scc-redis scc-homes-pg
docker start scc-postgres-boot scc-redis scc-homes-pg
sleep 5
curl http://localhost:3011/health
bash scripts/startup.sh
Tips สำหรับ Debug: เมื่อพบปัญหา ให้เริ่มจากการดู logs ก่อน — docker logs <container> --tail 50 แล้วดู error message จริง อย่า guess สาเหตุ ให้ root cause ก่อนแก้ และอย่าแก้หลาย service พร้อมกัน ให้แก้ทีละอย่างและทดสอบก่อน
UI LAYOUT DESCRIPTION
คำอธิบาย UI Layout ของหน้า /scrapers
Header Bar: ด้านบนสุดแสดง navigation tabs สำหรับ Scrapers, Jobs, URLs, Pipeline และ Publisher แต่ละ tab มีสัญลักษณ์และตัวเลข count แสดงสถานะ
KPI Dashboard: แถวตัวเลขสำคัญ 5 ตัว — Total Jobs, Success Rate, Avg Duration, Active Now, URLs Tracked แสดงด้วยตัวเลขใหญ่สีส้ม-ทอง บน dark background
Filter Bar: ด้านบนของ scraper list มี filter สำหรับแยกตาม category (All, NPA, Listing, Content) และ status (All, Idle, Running, Error, Paused)
Scraper Grid: แสดง scraper cards เรียงเป็น grid 3 คอลัมน์ (desktop) แต่ละ card มี scraper name, status pill, KPIs ย่อย และปุ่ม Details
Color Coding: สีเขียว = IDLE/success, สีส้ม = กำลังรัน, สีแดง = error, สีเทา = paused — ดูสถานะ fleet ได้ทันทีด้วย visual scan