Bộ crawler dữ liệu nhà cung cấp
Mỗi website là một folder độc lập, chạy bằng GUI hoặc CLI, tự dừng khi bị chặn, dừng giữa chừng thì chạy lại là tiếp tục. Trang này tóm tắt tech stack và cách dùng trên một màn hình.
Kiến trúc tổng thể
Ba cách nhập (GUI, CLI, cột Excel) đi vào cùng một lõi async. Lõi tìm danh sách sản phẩm, tải trang chi tiết, ghi checkpoint sau từng mục rồi xuất Excel.
Tech stack
Mặc định nhẹ, không cần browser. Bị chặn thì leo dần từ cách rẻ nhất: API/JSON → sitemap → httpx → curl_cffi → Playwright → Patchright. Không dùng Selenium. Cập nhật 10/2026.
Mạng
- httpx async, pool, follow_redirects, timeout
- asyncio Semaphore + aiolimiter (req/giây)
- curl_cffi khi bị chặn do TLS fingerprint
- tenacity retry · tôn trọng
Retry-After - protego đọc robots.txt
Parse
- selectolax (lexbor) — nhanh nhất
- BeautifulSoup + lxml khi cần full page
- JSON nhúng:
__NEXT_DATA__,.js, Store API
Giao diện
- tkinter + ttk (theme clam), không cần cài thêm
- Log qua
queue.Queue, worker thread daemon - argparse CLI chạy headless
Lưu trữ
- SQLite work-queue (WAL) cho site lớn
- JSONL (orjson) / JSON session cho site vừa
- openpyxl Excel thường · xlsxwriter file lớn
- pydantic chuẩn hoá record (tuỳ chọn)
Browser (khi bắt buộc)
- Playwright / Patchright
- warmup trang chủ để lấy cookie Cloudflare
- headed khi headless bị chặn
Chất lượng
- pytest với HTML thật đã lưu
- sites.py doctor soi luật bằng máy
- ruff lint/format · uv môi trường
- sites.json → SITES.md registry
Một lần chạy đi qua những bước nào
Ví dụ chế độ Crawl ALL. Các chế độ theo mã, từ khoá, link hay Excel bỏ qua bước khám phá toàn site.
Cách dùng
Cài một lần, sau đó mỗi site chạy độc lập. Kết quả nằm trong out_<name>/ ngay trong folder site.
git clone https://github.com/nhattrung0911/web-crawler cd web-crawler pip install httpx selectolax openpyxl pandas tenacity pytest # chỉ khi crawler cần browser: pip install playwright && playwright install chromium
.bat trong folder site (Windows). Chọn chế độ ở cột trái, nhập mã / từ khoá / link hoặc chọn file Excel + cột, bấm START.
_vn\vxanh_com\vxanh.bat
- Pause: chặn request mới, request đang chạy làm nốt.
- Stop: dừng trong vài giây, giữ dữ liệu đã có.
- EXPORT: xuất Excel phần đã crawl.
- Đóng cửa sổ là tắt hẳn, không để process chạy ngầm.
--help.
cd _vn/trungtamthietbi_com python trungtamthietbi.py --mode code --code TCK-120-035 python trungtamthietbi.py --mode keyword --keyword makita --limit 50 python trungtamthietbi.py --mode all --conc 16 > run.log # log hiện từng dòng
out_<name>/. Stop, Ctrl+C hay mất điện đều không mất phần đã tải.
python trungtamthietbi.py --mode all # chạy lần 1, bấm Stop giữa chừng python trungtamthietbi.py --mode all # chạy lại: "Resume: 4853 dòng đã xong → bỏ qua"
Chạy xong trọn vẹn thì checkpoint tự xoá; dừng giữa chừng thì giữ lại.
Thêm một site mới — 6 bước
Chi tiết đầy đủ trong AGENTS.md. Đây là bản rút gọn.
- Tra registry
python sites.py https://site.com/— đã có thì sửa folder cũ. - Recon: săn API trướccurl thử
/products.json,/wp-json,__NEXT_DATA__; đo thời gian 1 request và thử song song. - Clone archetype sạch gần nhấtChọn crawler đạt doctor có cùng nền tảng (Sapo, WooCommerce, PHP SSR…).
- Code + .bat
_<vùng>/<domain>/<name>.py; output vàoout_<name>/; test với HTML thật. - Kiểm chứngChạy live bằng mã thật ·
pytest·python -B sites.py doctor <name>phải SẠCH. - Cập nhật registryGhi note recon vào
sites.json, chạypython sites.pysinh lạiSITES.md.
An toàn & bài học đã gặp
Crawler chạy trên máy người dùng và gọi vào server người khác, nên luật an toàn là bắt buộc. doctor kiểm các luật này bằng máy.
| Luật | Vì sao |
|---|---|
CIRCUIT_BREAK = 25 | Lỗi liên tiếp = nghi bị chặn IP → dừng |
MAX_ITEMS / MAX_PAGES | Chặn vòng lặp vô tận; cắt thì ghi [WARN] |
| Backoff 429 + pause toàn cục | Không dội server khi bị rate-limit |
| Resume checkpoint | Crawl hàng nghìn mục không làm lại từ đầu |
os._exit(0) khi đóng GUI | Không để thread / socket chạy ngầm |
| Khớp mã chính xác | Không lấy nhầm kết quả search đầu tiên |