Hệ thống tự động crawl website công ty, extract email và thông tin liên hệ, ghi ngược lại Google Sheet. Scale 1,000–5,000 leads/batch với chi phí gần bằng 0.
asyncio + httpx.AsyncClient cho concurrency.
r.jina.ai/{url}. Convert URL → clean Markdown.
Handle JS rendering, không cần tự chạy Playwright. Free 1M tokens on signup.
Detect thị trường/ngôn ngữ từ Sheet column hoặc TLD domain để chọn đúng URL pattern set. Tăng hit rate 20–30% trên non-English markets.
Verify domain còn sống trước mọi thứ. Không tốn token. Lọc ~15–20% dead domains ngay từ đầu.
Fetch homepage trước tiên. ~20% sites publish email ngay homepage. Nếu tìm được → done, không cần crawl thêm. Cũng detect parked domain từ bước này.
Trước khi gọi Jina cho từng pattern URL, dùng HEAD request kiểm tra URL có tồn tại không. 404 → skip ngay. Tiết kiệm ~60% Jina calls so với không có bước này.
Gọi Jina Reader với browser engine forced để đảm bảo JS chạy. Nhận clean Markdown → chạy regex extractor. Handle Cloudflare email obfuscation tự động.
Validate email bằng DNS MX check (không tốn API, chỉ verify domain có mail server). Ghi kết quả về Google Sheet kèm status column để tracking.
* Non-English markets luôn append English patterns làm fallback — nhiều công ty KR/JP dùng EN URLs.
Cloudflare encode email bằng XOR với byte đầu tiên làm key. Browser decode qua JS khi render.
Crawler nhận raw HTML thấy data-cfemail="a3c2..." thay vì email thật.
| Tình huống | Xử lý |
|---|---|
| Raw HTML crawl | Decode XOR function, 5 dòng code |
| Jina + browser engine | Chrome decode tự động ✓ |
| Jina + curl mode | Force X-Engine: browser |
| Status | HTTP Code | Nguyên nhân | Hành động | Token tốn |
|---|---|---|---|---|
| dns_failed | — | Domain expire, không còn tồn tại | Skip toàn bộ domain | 0 |
| parked | 200 | "Domain for sale", GoDaddy parking | Skip, ghi nhận | ~500 |
| 404 | 404 | URL pattern không tồn tại | Thử pattern tiếp | 0 (HEAD check) |
| blocked_403 | 403 | Bot bị block, nhưng page tồn tại | Thử Jina với x-proxy | ~1,500 |
| rate_limited | 429 | Target site giới hạn requests | Wait 30s, retry ×1 | ~1,500 |
| server_down | 5xx | Server lỗi, Cloudflare origin down | Skip pattern | 0 (HEAD check) |
| ok_redirected | 301/302 | Công ty đổi domain mới | Follow, ghi domain mới | ~1,500 |
| no_email_found | 200 | Site sống, chỉ dùng contact form | Ghi nhận, không có email | ~7,500 |
| ok | 200 | Email extracted thành công | Write to Sheet ✓ | ~1,500–7,500 |
* DE/FR cao vì Impressum/Mentions Légales là bắt buộc theo luật
| Tier | RPM | Concurrent | Cost |
|---|---|---|---|
| Free | 100 | 2 | $0 |
| Paid | 500 | 50 | Token-based |
| Premium | 5,000 | 500 | Custom |
| Company | Website | Status | Last Checked | |
|---|---|---|---|---|
| Công ty ABC | abc.vn | [email protected] | ok | 2026-05-28 |
| XYZ Corp | xyz.com | — | dead | 2026-05-28 |
| DEF Solutions | def.vn | — | parked | 2026-05-28 |
| GHI Ltd | ghi.com → newghi.com | [email protected] | ok_redirected | 2026-05-28 |
| JKL Company | jkl.vn | — | no_email_found | 2026-05-28 |