web-crawler

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.

49crawler
29site Việt Nam
12site quốc tế
5 · 3site Nhật · Trung
1file .py + 1 file .bat / site

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.

Python 3.13, rồi cài thư viện:
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

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.

  1. Tra registrypython sites.py https://site.com/ — đã có thì sửa folder cũ.
  2. Recon: săn API trướccurl thử /products.json, /wp-json, __NEXT_DATA__; đo thời gian 1 request và thử song song.
  3. Clone archetype sạch gần nhấtChọn crawler đạt doctor có cùng nền tảng (Sapo, WooCommerce, PHP SSR…).
  4. Code + .bat_<vùng>/<domain>/<name>.py; output vào out_<name>/; test với HTML thật.
  5. Kiểm chứngChạy live bằng mã thật · pytest · python -B sites.py doctor <name> phải SẠCH.
  6. Cập nhật registryGhi note recon vào sites.json, chạy python sites.py sinh lại SITES.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ậtVì sao
CIRCUIT_BREAK = 25Lỗi liên tiếp = nghi bị chặn IP → dừng
MAX_ITEMS / MAX_PAGESChặn vòng lặp vô tận; cắt thì ghi [WARN]
Backoff 429 + pause toàn cụcKhông dội server khi bị rate-limit
Resume checkpointCrawl hàng nghìn mục không làm lại từ đầu
os._exit(0) khi đóng GUIKhông để thread / socket chạy ngầm
Khớp mã chính xácKhông lấy nhầm kết quả search đầu tiên
Dùng có trách nhiệm. Tôn trọng robots.txt và điều khoản từng website, giữ số luồng vừa phải, chỉ lấy dữ liệu công khai.