Thách thức
Bạn đang xây dựng một sản phẩm B2B SaaS. Khách hàng của bạn tải lên một danh sách tên công ty. Họ mong đợi nhận lại một bản ghi sạch: nhóm doanh thu, số lượng nhân sự, tech stack, vòng gọi vốn, các liên hệ chính, tin tức gần đây. Họ mong đợi nhận được kết quả trong vài phút chứ không phải vài ngày. Và họ mong đợi dữ liệu đó phải chính xác.
Dữ liệu đó có tồn tại. Nó nằm trên Crunchbase, trên các trang Giới thiệu của công ty, trên các trang công ty của LinkedIn, trên Google Maps, trên Glassdoor, trên các cổng đăng ký kinh doanh của khu vực, trên kho lưu trữ của TechCrunch. Vấn đề là làm thế nào để truy cập dữ liệu đó một cách đáng tin cậy.
Mỗi nguồn dữ liệu lại gặp lỗi theo một cách khác nhau. Crunchbase vận hành một ứng dụng phía client nặng nề, tự render lại nếu nghi ngờ có bot. LinkedIn giới hạn rate-limit cực kỳ nghiêm ngặt và thay đổi DOM nhanh hơn tốc độ bạn vá các selector (một bài đăng phổ biến trong cộng đồng đã thử nghiệm một công cụ scraper Python cơ bản chỉ thu thập được khoảng 50 hồ sơ trước khi hệ thống chống bot chặn lại). Các trang web của công ty trải dài từ HTML tĩnh đến các ứng dụng đơn trang (single-page app) cần một trình duyệt đầy đủ để hiển thị nội dung. Các danh bạ khu vực thay đổi giao diện hàng quý và chặn truy cập bằng các rào cản theo quốc gia. Theo một báo cáo ngành năm 2026 từ GroupBWT, 10-15% crawler trong một số lĩnh vực cần được sửa chữa hàng tuần chỉ để bắt kịp với các bản cập nhật chống bot và sự thay đổi DOM.
Vì vậy, pipeline làm giàu dữ liệu của bạn bắt đầu với một thiết kế năm nguồn gọn gàng. Sáu tháng sau, nó trở thành một mớ hỗn độn của các scraper hỏng một nửa, các hàng đợi thử lại (retry queue), và một kênh Slack tên là #scraper-alerts mà không ai buồn mở ra nữa (chúng tôi đã từng viết về chi phí ẩn của việc tự duy trì scraper trước đây). Các khiếu nại về chất lượng dữ liệu chất đống trong hàng đợi hỗ trợ của bạn. Đội ngũ của bạn bắt đầu đùa rằng tên công ty đáng lẽ phải là "Năm Scraper và một Lời cầu nguyện".
Giải pháp
Hãy tạm quên các scraper đi. Phần khó nhất của việc làm giàu dữ liệu không phải là trích xuất. Đó là định tuyến (routing): quyết định nguồn nào cần công cụ nào, proxy nào, chính sách thử lại nào, và điều gì được tính là một response "tốt".
Một nền tảng như FourA cung cấp cho bạn ba sản phẩm tương thích trực tiếp với ba loại nguồn dữ liệu mà bạn sẽ tiếp cận.
Các danh bạ và cổng đăng ký HTML tĩnh. Hầu hết các cổng đăng ký kinh doanh khu vực và nhiều danh bạ B2B cũ hơn đều được render phía máy chủ (server-rendered). Chúng cần một request HTTP nhanh, ít tốn tài nguyên từ một IP sạch. Đó là Single: một URL đầu vào, một response đầu ra. Thêm unblocker: true và nó sẽ vượt qua các rào cản ở cấp độ bắt tay (handshake) vốn có thể chặn đứng một HTTP client thông thường. Single tự động định tuyến qua Proxy Finder và trả về proxy id ở cấp cao nhất của response (r.proxy) để các cuộc gọi tiếp theo của bạn có thể truyền lại dưới dạng proxy:"<id>" nhằm giữ nguyên cổng ra khi bạn cần duy trì session.
Các SPA nặng về JavaScript. Crunchbase, các ứng dụng kiểu LinkedIn, và thậm chí cả các trang web công ty quy mô vừa sẽ không trả về dữ liệu bạn muốn từ một response HTTP thông thường. Chúng render ở phía client. Đó là Browser: một trình duyệt đầy đủ sẽ thực thi trang web, chạy JS, và trả lại cho bạn HTML đã render, cookie, và ảnh chụp màn hình. Giống như Single, nó tự động định tuyến qua Proxy Finder bên dưới, không cần bước lựa chọn riêng biệt từ phía bạn.
Các nguồn hỗn hợp có xác thực. Mỗi request gửi đến API của FourA đều chấp nhận một block validate. Bạn có thể yêu cầu các mã trạng thái cụ thể, khớp header, hoặc khớp chuỗi con trong body. Nếu response là một soft-fail (một trang 200 đi kèm CAPTCHA, hoặc một khung dữ liệu trống, hoặc một trang trung gian "chúng tôi xin lỗi"), trình xác thực sẽ từ chối nó. Pipeline của bạn sau đó có thể định tuyến cùng một URL đó qua Browser để thay thế. Chỉ riêng tính năng đó đã loại bỏ loại lỗi tốn kém nhất trong việc làm giàu dữ liệu: lỗi ẩn (silent failure) ghi dữ liệu rác vào cơ sở dữ liệu của bạn.
Dưới đây là cấu trúc của một cuộc gọi nguồn đơn (single-source):
curl -X POST https://api.foura.ai/api/single \
-H "Authorization: Bearer pk_live_..." \
-d '{
"url": "https://registry.example.com/company/123",
"unblocker": true,
"followRedirects": 5,
"validate": {
"status": { "accept": [200] },
"data": { "fail": ["captcha", "blocked", "access denied"] }
}
}'
Và lệnh Browser tương đương cho một trang web công ty nặng về JavaScript:
curl -X POST https://api.foura.ai/api/browser \
-H "Authorization: Bearer pk_live_..." \
-d '{
"url": "https://www.example-saas.com/about",
"unblocker": true
}'
Logic định tuyến nằm trong pipeline của riêng bạn. Sự tin cậy nằm ở phía chúng tôi. Bạn quyết định nguồn nào của mình sẽ sử dụng công cụ nào. Chúng tôi đảm bảo công cụ đó thực sự vượt qua rào cản thành công.
Kết quả
Chúng tôi đã chứng kiến một số đội ngũ chuyển đổi từ các scraper tự phát triển sang pipeline định tuyến bằng FourA trong giai đoạn public beta. Mô hình này rất nhất quán (các số liệu minh họa dựa trên những gì chúng tôi ghi nhận được từ nhóm thử nghiệm beta):
- Độ trễ làm giàu dữ liệu (enrichment latency) giảm từ 3-6 giây cho mỗi công ty xuống dưới mức trung vị 1.5 giây trên các tuyến cached-residential
- Tỷ lệ lỗi ẩn (silent-failure rate) (các response trả về mã 200 nhưng không có dữ liệu) giảm từ khoảng 8% xuống dưới 1% sau khi block
validatephát hiện các soft-fail trước khi chúng tiếp cận cơ sở dữ liệu - Thời gian kỹ thuật dành cho việc bảo trì scraper giảm từ 1-2 kỹ sư toàn thời gian xuống còn một kênh Slack hầu như luôn yên tĩnh
- Tỷ lệ thành công ngay từ lần thử đầu tiên (first-pass success rate) trên các danh bạ được bảo vệ tăng lên mức trên 90% khi
unblocker: trueđược kết hợp với một proxy id sạch
Một con số nữa đáng lưu ý: chúng tôi nhận thấy độ chính xác trong lần thử đầu tiên (đúng dữ liệu, đúng công ty) thấp hơn tỷ lệ thành công trong lần thử đầu tiên khoảng bốn phần trăm. Bài học ở đây không phải là việc thu thập dữ liệu quá khó khăn. Mà là bạn vẫn cần xác thực bản ghi so với công ty mà bạn thực sự yêu cầu (chúng tôi đã viết về mô hình đó trong bài viết tại sao web scraper của bạn liên tục bị hỏng).
Những con số thực sự quan trọng không phải là kích thước proxy pool hay số lượng request. Đó là tỷ lệ endpoint làm giàu dữ liệu của bạn trả về đúng dữ liệu ngay trong lần thử đầu tiên, và độ dốc của biểu đồ bảo trì scraper của bạn trong sáu tháng tới.
Bài học chính
Các pipeline làm giàu dữ liệu thường hỏng một cách âm thầm theo thời gian. Scraper đầu tiên bạn viết trông có vẻ ổn vào ngày thứ Ba. Đến nguồn thứ ba, bạn phải vá các selector vào lúc 11 giờ đêm. Đến nguồn thứ mười, bạn đang gánh một khoản nợ bảo trì tăng dần theo quy mô khách hàng của mình. Đến nguồn thứ hai mươi, bạn âm thầm ngừng tích hợp các nguồn mới vì không ai trong đội ngũ muốn chịu trách nhiệm quản lý nguồn tiếp theo.
Nút thắt cổ chai chưa bao giờ nằm ở nguồn dữ liệu. Nó nằm ở việc định tuyến: chọn đúng công cụ, đúng proxy, đúng quy tắc xác thực cho mỗi URL, trong mọi lần chạy. Hãy xây dựng lớp đó một lần, giao nó cho một hệ thống đã làm tốt việc đó, và đội ngũ của bạn sẽ có thể dành ngày thứ Ba để phát triển sản phẩm thay vì phải đi xử lý các lỗi selector bị hỏng.