Truy xuất thông minh (Tự động)
Bạn cung cấp cho FourA một URL và một quy tắc validate cho nội dung mà trang thực tế cần chứa. FourA sẽ xử lý phần còn lại: duyệt qua thang tối ưu chi phí, dừng lại ở bậc đầu tiên trả về response được quy tắc của bạn chấp nhận, và ghi nhớ phương thức thành công cho từng host để lệnh gọi tiếp theo trên cùng trang web có chi phí thấp.
Hướng dẫn này giải thích cơ chế hoạt động bên dưới của auto, thời điểm nên sử dụng và cách đọc response của nó. Để xem tài liệu tham khảo tham số, hãy xem API Endpoints.
Ý tưởng cốt lõi
Hầu hết các hệ thống scraping yêu cầu bạn chọn engine ngay từ đầu. Single nhanh nhất, Proxy bổ sung xoay vòng IP, Browser xử lý JavaScript. Nếu bạn đoán sai, bạn sẽ lãng phí credit hoặc bị chặn.
Auto đảo ngược quy trình này. Bạn khai báo điều kiện thành công (validate), không phải phương thức. FourA sẽ leo từng bậc thang cho đến khi có một bậc thành công:
- Thử nghiệm chi phí thấp (single, trực tiếp từ mạng của FourA)
- Browser, trực tiếp từ mạng của FourA, có JavaScript và trình giải CAPTCHA nếu trang web đưa ra thử thách
- Single với proxy xoay vòng
- Browser qua proxy cho các mục tiêu khó nhất
Auto dừng lại ngay khi một bậc trả về response mà quy tắc validate của bạn chấp nhận.
Có một bậc nằm ngoài thứ tự đó. Khi một exit kết nối được tới trang web nhưng trang web từ chối URL sâu mà bạn yêu cầu, auto sẽ tải trang chủ của trang web qua cùng exit đó, giữ lại cookie mà trang chủ cung cấp, và yêu cầu lại URL của bạn cùng với các cookie đó. Đó là bậc warmup. Bậc này chỉ chạy trên URL sâu hơn root của trang web, chỉ sau khi lượt thử trực tiếp đã thất bại, và chỉ có thể mang lại kết quả bổ sung chứ không bao giờ làm giảm kết quả.
forceProxy mặc định là true, vì vậy bậc 1 và 2 được bỏ qua và mục tiêu không bao giờ thấy địa chỉ IP riêng của FourA. Hầu hết các lệnh gọi sau đó sẽ hoàn tất ở bậc 3, hoặc trên một session ấm được phát lại. Đặt forceProxy: false khi bạn biết mục tiêu xử lý địa chỉ sạch tốt hơn địa chỉ xoay vòng, và bậc 1 cùng bậc 2 sẽ được kích hoạt lại.
Dữ liệu bạn gửi
Yêu cầu tối thiểu là một URL kèm theo một chuỗi con validate. Auto tự nhận diện các trang thử thách phổ biến, nhưng nếu không có validate.data.accept, hệ thống không thể phân biệt trang thực tế với trang kiểm tra mà nó chưa biết, hoặc với trang tải không có nội dung của bạn, và có thể trả về một trong hai trường hợp đó dưới dạng thành công.
curl -X POST https://eu.api.foura.ai/api/auto/ \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/product/42",
"validate": {"data": {"accept": ["Add to cart"]}}
}'
Các tùy chọn bổ sung (xem tài liệu tham khảo endpoint để biết đầy đủ chi tiết):
returnSession(mặc địnhtrue): trả về{ proxy, cookies, userAgent }thành công để bạn có thể phát lại (replay).forceProxy(mặc địnhtrue): bỏ qua các bậc direct-egress. Chỉ đặtfalsenếu bạn biết trang web thân thiện với IP sạch hơn là proxy xoay vòng miễn phí.timeout_ms(mặc định120000): tổng ngân sách thời gian cho toàn bộ lệnh gọi. Bậc thang sẽ phân bổ ngân sách này qua các bậc.ignoreProxies: danh sách proxy ID cần tránh trong mỗi lần thử phụ.followRedirects(mặc định5): số lần chuyển hướng (redirect) tối đa trên các bậc chi phí thấp.
Kết Quả Bạn Nhận Được
{
"status": 200,
"data": "<!doctype html>...",
"headers": [{"content-type": "text/html"}],
"meta": {
"rung": "cache",
"solved": false,
"attempts": 1,
"credits": 2
},
"session": {
"proxy": "A1B2C3",
"cookies": [{"name": "session", "value": "abc", "domain": "example.com"}],
"userAgent": "Mozilla/5.0..."
}
}
Ba điểm cần đọc:
statusvàdata: phản hồi từ mục tiêu.datalà văn bản trên mọi nấc: trang JSON trả về dưới dạng chuỗi JSON ngay cả khi trình duyệt phân phối, vì vậy hãy phân tích cú pháp ở phía bạn.statuslà trạng thái HTTP của mục tiêu, không phải trạng thái truyền tải của lệnh gọi đến FourA. Đối với các nấc single và proxy,headerslà một mảng theo từng chặng. Đối với các nấc browser,headerslà một đối tượng phẳng.meta: dấu vết về những gì thang đã thực hiện, có trong mọi phản hồi sau khi thang đã bắt đầu.meta.rungnêu tên bước đã gửi phản hồi,meta.attemptsđếm số lần thử lệnh gọi phụ,meta.solvedgắn cờ liệu trang thử thách đã hoàn thành hay chưa, vàmeta.creditslà tổng chi tiêu cho lệnh gọi (cùng một số với headerX-FourA-Credits).session: bộ ba{ proxy, cookies, userAgent }đã giải mã mục tiêu. Sử dụng nó để phát lại với cùng một máy chủ lưu trữ qua/api/single/hoặc/api/browser/.
Auto trả lời bằng HTTP 200 bất cứ khi nào thang đã chạy, ngay cả khi mọi nấc đều thất bại. Đọc status và error trong body để tìm hiểu điều gì đã xảy ra, không phải mã trạng thái truyền tải. Mã khác 200 từ /api/auto/ nghĩa là lệnh gọi chưa bao giờ đến thang: 401 cho key không hợp lệ, 400 cho body không phải là JSON hợp lệ hoặc mục tiêu nằm trên mạng riêng tư, và 502, 503 hoặc 504 khi dịch vụ không thể nhận lệnh gọi hoặc hết thời gian. Auto không chiếm slot tại gateway, do đó các giới hạn dùng chung của nền tảng không từ chối chính lệnh gọi đó: khi một giới hạn từ chối lệnh gọi mà thang đã thực hiện, phản hồi là HTTP 200 với status: 429 hoặc 503 và retryAfter trong body. Trường không vượt qua xác thực cũng trả về HTTP 200, với status: 400. Giới hạn gói đăng ký đạt đến bên trong thang cũng trả về HTTP 200, với sự từ chối trong body (xem When Your Plan's Limits Meet the Ladder).
Phát lại bằng Session
Sau khi auto trả về một session, bạn có thể chuyển thẳng sang Single hoặc Browser cho các trang tiếp theo trên cùng một máy chủ lưu trữ. Không cần leo thang mới, không cần thăm dò mới.
import requests
API = "https://eu.api.foura.ai"
KEY = "YOUR_API_KEY"
H = {"X-API-Key": KEY, "Content-Type": "application/json"}
# 1) First call: let auto figure it out.
r = requests.post(f"{API}/api/auto/", headers=H, json={
"url": "https://example.com/product/42",
"validate": {"data": {"accept": ["Add to cart"]}},
}).json()
session = r["session"]
proxy = session["proxy"]
user_agent = session["userAgent"]
# 2) Follow-up pages: replay through single with the same proxy + UA.
for sku in ("43", "44", "45"):
r = requests.post(f"{API}/api/single/", headers=H, json={
"method": "GET",
"url": f"https://example.com/product/{sku}",
"proxy": proxy,
"headers": [["User-Agent", user_agent]],
}).json()
print(sku, r["status"])
Session chỉ duy trì lâu bằng mức trang mục tiêu cho phép. Một số trang liên kết clearance với cookie jar trong nhiều giờ; những trang khác xoay vòng sau mỗi vài phút. Nếu việc replay bắt đầu trả về challenge trở lại, hãy gọi /api/auto/ thêm một lần nữa để làm mới.
Khi nào nên dùng Auto
| Dùng auto | Tự dùng single, proxy, hoặc browser thủ công |
|---|---|
| Bạn nhắm vào trang mới và chưa biết nó cần gì | Bạn đã biết engine nào hoạt động hiệu quả |
| Bạn muốn một lệnh gọi tự xử lý direct, proxy, và browser fallback | Bạn muốn toàn quyền kiểm soát retry và timeout trên từng lệnh gọi |
| Bạn chấp nhận mất vài giây dò tìm ở lệnh gọi đầu tiên | Độ trễ của lệnh gọi đầu tiên quan trọng hơn việc tự động phát hiện |
| Bạn muốn có một session đã học để replay với chi phí thấp | Bạn đang tối ưu hóa một vòng lặp chặt chẽ trên mục tiêu đã biết rõ |
Auto không phải lúc nào cũng là lựa chọn rẻ nhất. Nếu bạn biết mục tiêu hoạt động với single + unblocker, gọi trực tiếp Single tốn 2 credit với độ trễ dự đoán được. Auto trên cùng mục tiêu đó sẽ tốn bất kỳ chi phí nào mà thang phân cấp của nó sử dụng, con số này có thể cao hơn nếu trang web yêu cầu leo thang.
Validate cho Auto biết thế nào là "Thành công"
Tham số quan trọng nhất là validate. Nếu không có nó, auto chỉ từ chối các trang challenge mà nó nhận diện được, vì vậy một trang kiểm tra lạ hoặc một shell rỗng trả về HTTP 200 sẽ bị coi là nội dung hợp lệ.
Sử dụng validate.data.accept với chuỗi con mà chỉ trang thật mới chứa:
{
"validate": {
"data": {
"accept": ["sku-42-add-to-cart", "Customer reviews"]
}
}
}
Đối với JSON API, hãy chấp nhận tên trường mà bạn mong đợi:
{
"validate": {
"data": { "accept": ["\"products\":["] },
"status": { "accept": [200] }
}
}
Đối với các trang web trả về mã không phải 200 một cách hợp lệ (giới hạn quốc gia mà bạn muốn bỏ qua, mã 403 có chủ đích trên các endpoint đã đăng xuất), hãy cho phép chúng thông qua validate.status.accept:
{
"validate": {
"status": { "accept": [200, 451] }
}
}
Nếu không có validate, auto sẽ mặc định coi "HTTP 200 = thành công" cho mọi trang mà nó không nhận diện là challenge, vì vậy nó sẽ không phát hiện được trang kiểm tra lạ mà trang web trả về với mã 200.
Đọc meta.rung để hiểu điều gì đã xảy ra
meta.rung là tín hiệu debug hữu ích nhất. Các giá trị:
probe: xử lý thành công bằng một request trực tiếp chi phí thấp. Tuyến có chi phí thấp nhất.proxy: cần xoay vòng proxy để vượt qua.browser: cần render bằng trình duyệt đầy đủ, có thể đi kèm giải challenge.cache: phát lại session ấm từ lệnh gọi auto trước đó. Tuyến rẻ nhất cho các lệnh gọi lặp lại.warmup: trang web phân phát trang đích ban đầu nhưng chặn URL sâu, vì vậy auto đã lấy trang ban đầu trước, giữ lại cookie được cấp và gửi lại request cùng chúng. Session được lưu từ nấc này không bị ràng buộc vào một điểm thoát duy nhất, do đó các lệnh gọi tiếp theo sẽ rơi vào các nấc chi phí thấp.fail: không có nấc nào tạo ra response được quy tắc của bạn chấp nhận.
meta.solved: true có nghĩa là một trang challenge đã xuất hiện và được hoàn thành trong lệnh gọi. meta.attempts là số lần thử sub-call trước khi thành công. Để biết chi tiết cụ thể, hãy đọc trường defense mà các nấc single và proxy trả về: xem Kiểm tra trang web.
Nếu một trang web liên tục dừng ở browser trong khi bạn mong đợi probe, hãy xem xét liệu quy tắc validate nghiêm ngặt hơn (hoặc bớt nghiêm ngặt hơn) có cho phép nấc rẻ hơn vượt qua hay không. Hãy nhớ rằng forceProxy mặc định là true, vì vậy bước kiểm tra direct-egress sẽ bị bỏ qua trừ khi bạn tắt nó.
Lỗi và các trường hợp đặc biệt
Khi auto thất bại, response sẽ mang status (thường là status của nấc thất bại cuối cùng) và một chuỗi error:
{
"status": 502,
"error": "could not find a working exit for the target",
"attempts": 7,
"meta": {
"rung": "fail",
"solved": false,
"attempts": 7,
"credits": 47
}
}
status là phản hồi của trang web trong lần thử cuối cùng mà auto từ chối, chẳng hạn như 403. Khi không có lần thử nào nhận được câu trả lời từ trang web, lỗi thường là 502 hoặc 504, và error cho biết không tìm thấy exit node hoạt động nào hay ngân sách timeout_ms đã cạn kiệt. status: 0 chỉ có nghĩa là tên máy chủ của mục tiêu không phân giải được, và câu trả lời đó không có meta vì bậc thang chưa từng bắt đầu.
Kiểm tra meta.attempts và meta.credits để xem ngân sách đã được dùng vào đâu. Nếu meta.attempts cao và meta.rung là fail sau nấc browser, mục tiêu có thể cần timeout_ms dài hơn, quy tắc validate nghiêm ngặt hơn, hoặc đơn giản là hiện không thể truy cập qua rotating proxy.
Khi giới hạn gói dịch vụ gặp ladder
Các sub-call của Auto là những request Single, Proxy và Browser thông thường dưới API key của bạn, vì vậy giới hạn gói dịch vụ sẽ áp dụng cho chúng. Ladder đọc mã X-FourA-Limit khi bị từ chối và xử lý hai trường hợp theo cách khác nhau.
Một nấc thang bị đóng vẫn để các nấc còn lại hoạt động bình thường. plan_limit_browser_daily (request Browser trong ngày của bạn đã dùng hết) và plan_limit_concurrency (endpoint đó đã chạy hết số lượng request đồng thời mà gói cho phép) chỉ đóng một nấc. Auto vẫn tiếp tục xử lý các nấc khác, nhờ đó bạn vẫn nhận được trang bất cứ khi nào rotating exit hoặc warm session phân phát được nội dung, đồng thời các exit đã thử không bị gắn cờ lỗi do giới hạn từ chính gói của bạn. Không có gì bị cấm và không có session nào bị loại bỏ.
Tài khoản hết hạn ngạch sẽ dừng ladder. plan_limit_credits, plan_limit_bandwidth, plan_limit_rate, plan_limit_feature, và plan_limit_premium không thể giải quyết bằng nấc thang khác, vì vậy auto trả về ngay lập tức thay vì tiêu tốn thêm credit của bạn để thử lại. Thông báo từ chối được trả về trong body cùng với trạng thái của sub-call và trường reason tương tự như các direct endpoint sử dụng:
{
"status": 429,
"error": "Credit limit reached: 75,000 of 75,000 credits used this billing period. Upgrade your plan or wait for the reset.",
"reason": "plan_limit_credits",
"documentation": "https://foura.ai/prices",
"used": 75000,
"hard_stop": 75000,
"retry_after_seconds": 86400,
"resets_at": "2026-10-01T00:00:00.000Z",
"meta": { "rung": "fail", "solved": false, "attempts": 1, "credits": 0 }
}
Toàn bộ nội dung từ chối từ sub-call được trả về đầy đủ, kèm theo status và meta. Hãy đọc status từ phần body chứ không phải từ trạng thái truyền tải: auto vẫn trả về HTTP 200 ở đây vì thang nâng cấp đã chạy. Phản hồi từ chối plan_limit_feature hoặc plan_limit_premium cũng được gửi về theo cách tương tự với status: 403. Một sub-call bị từ chối sẽ không tốn chi phí, vì vậy meta.credits chỉ tính các nấc thang thực sự tiếp cận được mục tiêu.
Một lệnh gọi auto có thể giữ nhiều slot trong khi thang nâng cấp của nó đang leo, do đó một batch các lệnh gọi auto song song sẽ chạm trần concurrency với số lượng lệnh gọi ít hơn bạn dự tính. Chạy Request Song Song hướng dẫn cách định cỡ batch.
Những Gì Auto Không Thực Hiện
- Nó không thay đổi các hạn chế pháp lý. Nếu một trang web từ chối mọi exit node mà FourA có thể tiếp cận, auto sẽ trả về kết quả từ chối đó.
- Nó không cache nội dung. Mọi lệnh gọi vẫn truy cập trực tiếp vào mục tiêu. "Warm session" ở đây là proxy và cookie, không phải response.
- Nó hiển thị thành một hàng trong Activity Log, dưới request id bạn nhận được, cùng với tổng credit của các sub-call cấu thành. Mở nó ra và các sub-call Single / Proxy / Browser mà auto đã thực hiện thay bạn sẽ được liệt kê dưới dạng các lượt thử, mỗi lượt có kết quả riêng. Chúng được tính vào giới hạn Single, Proxy và Browser của bạn, không bao giờ tính vào số lượng request hay tỷ lệ thành công của bạn.
Liên Quan
- API Endpoints: Tài liệu tham khảo đầy đủ về tham số
- Chọn Endpoint Phù Hợp: Khi nào nên chọn auto so với single, proxy, hoặc browser
- Kết Quả Request: Các kết quả nào bị tính phí
- Các Trang Web Được Bảo Vệ: Cách FourA xử lý trên các trang web kiểm tra danh tính người yêu cầu
- Kiểm Tra Trang Web: Trường
defenseđằng saumeta.solved - MCP Recipes: Các pattern tương tự dưới dạng lệnh gọi công cụ MCP
- Rate Limits: Giới hạn gói dịch vụ mà các sub-call của auto được áp dụng để đo lường