Trích xuất dữ liệu
Yozh Scraper hiển thị bất kỳ URL nào trong trình duyệt Playwright thực tế và trả về chính xác những gì bạn yêu cầu — các trường dữ liệu đã trích xuất, mã HTML thô hoặc ảnh chụp màn hình toàn trang. Mỗi lần trích xuất đều là một tác vụ không đồng bộ: gửi URL, kiểm tra trạng thái tác vụ, và lấy kết quả. Các tính năng như proxy, chế độ ẩn danh, cài đặt sẵn và phiên đăng nhập đều được hỗ trợ đầy đủ.
- Kết xuất thực tế trên trình duyệt — Playwright kết xuất các trang được xây dựng bằng JavaScript; chuyển sang
renderđể hiển thị HTML tĩnh. - Trích xuất có cấu trúc — Các quy tắc trường CSS hoặc XPath trả về một
data, tiết kiệm thời gian và công sức hơn nhiều so với việc tự tải xuống và phân tích cú pháp HTML thô. - Proxy tích hợp sẵn — CyberYozh dành cho người dùng cá nhân / LTE di động / trung tâm dữ liệu, hỗ trợ định vị theo khu vực địa lý (GEO) và không có hiện tượng “hunting pool-id”.
- Chế độ ẩn danh theo mặc định — các bản vá playwright-stealth (
navigator.webdriver, dấu vân tay WebGL / Canvas, thời gian chạy Chrome) nhằm giảm khả năng bị phát hiện là bot. - Cài đặt sẵn — trích xuất dữ liệu từ Amazon / Google / eBay / Walmart / YouTube / LinkedIn theo tên, kèm tính năng tự phục hồi LLM tùy chọn.
- Phiên làm việc — các phiên làm việc đã được xác thực do máy chủ quản lý dành cho các mục tiêu đã đăng nhập, được tái sử dụng trong các lần thu thập dữ liệu.
:8001) sẽ thu thập dữ liệu trên một trang web bắt đầu từ một URL gốc và tải về mọi trang thông qua công cụ thu thập dữ liệu này — các tính năng hiển thị, proxy và phiên làm việc tương tự cũng được áp dụng cho các trang đã được thu thập.Bắt đầu nhanh
Trình trích xuất được khởi chạy từ gốc docker-compose.yml (cùng với bộ thu thập dữ liệu):
cp .env.example .env # set CYBERYOZH_API_KEY if using proxies docker compose up --build # scraper → http://localhost:8000 # crawler → http://localhost:8001
Kiểm tra xem nó đã hoạt động chưa:
curl http://localhost:8000/api/v1/health
# {"status":"ok","workers":2}
CYBERYOZH_API_KEY trong .env (lấy tại app.cyberyozh.com/api-access). Nếu không có khóa này, chỉ có proxy_type: none hoạt động.Cách sử dụng cơ bản
Mỗi điểm cuối scrape sẽ tạo ra một tác vụ chạy nền và trả về một job_id. Kiểm tra tiến trình công việc, sau đó lấy kết quả của nó.
curl -X POST http://localhost:8000/api/v1/scrape/page
-H "Content-Type: application/json"
-d '{ "url": "https://example.com", "proxy_type": "none" }'
# → { "job_id": "req_abc123" }
curl http://localhost:8000/api/v1/scrape/req_abc123 # status
curl http://localhost:8000/api/v1/scrape/req_abc123/results # results
Kết quả cuối cùng sẽ chứa siêu dữ liệu cùng với bất kỳ thông tin nào bạn yêu cầu (data, raw_html, screenshot_base64):
{
"job_id": "req_abc123",
"status": "done",
"total": 1, "done": 1,
"results": [
{
"request_id": "req_abc123",
"took_ms": 1234,
"meta": { "url": "https://example.com", "final_url": "https://example.com/",
"status_code": 200, "device": "desktop", "proxy_type": "none", "retries": 0 },
"data": null, "raw_html": null, "screenshot_base64": null, "warnings": []
}
]
}
status động tác queued → running → done (hoặc failed / cancelled). Kết quả có sẵn cho done, failed, và cancelled công việc.Trích xuất dữ liệu
Áp dụng một extract quy tắc và phản hồi sẽ bao gồm một data đối tượng có các khóa là tên trường của bạn — tiết kiệm hơn nhiều so với việc tải xuống raw_html và tự phân tích dữ liệu. Các quy tắc là css hoặc xpath.
curl -X POST http://localhost:8000/api/v1/scrape/page
-H "Content-Type: application/json"
-d '{
"url": "https://example.com",
"extract": {
"type": "css",
"fields": {
"title": { "selector": "h1", "attr": "text", "required": true }
}
}
}'
# result → { "data": { "title": "Example Domain" } }
Mỗi trường là một quy tắc:
| Khóa trường | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
selector | string | bắt buộc | Bộ chọn CSS hoặc biểu thức XPath cho trường này. |
attr | string | text | Nên đọc gì — text hoặc tên thuộc tính (ví dụ: href, src). |
all | bool | false | Trả về tất cả các kết quả khớp dưới dạng danh sách thay vì chỉ kết quả đầu tiên. |
required | bool | false | Báo lỗi khi thiếu — kích hoạt cơ chế tự phục hồi được cài đặt sẵn của LLM. |
Sử dụng "type": "xpath" với các bộ chọn XPath (ví dụ: //h1) cho cùng một hình dạng.
Ảnh chụp màn hình & mã HTML thô
Đặt screenshot: true để tạo tệp PNG toàn trang (dạng base64 trong screenshot_base64), hoặc raw_html: true để lấy toàn bộ mã HTML sau khi hiển thị trong raw_html.
curl -X POST http://localhost:8000/api/v1/scrape/page
-H "Content-Type: application/json"
-d '{ "url": "https://example.com", "screenshot": true, "raw_html": true }'
block_assets, hãy tắt tính năng này đối với ảnh chụp màn hình để hình ảnh được hiển thị.Proxy
Để quá trình thu thập dữ liệu diễn ra đáng tin cậy, việc sử dụng proxy là điều không thể thiếu — hầu hết các trang web hiện đại đều chặn các yêu cầu truy cập trực tiếp. Yozh tích hợp với Dịch vụ Proxy CyberYozh; hãy thiết lập proxy_type cho bất kỳ yêu cầu nào.
| proxy_type | Đó là gì? |
|---|---|
res_rotating | Chế độ xoay dành cho khu dân cư — cài đặt mặc định được khuyến nghị. |
res_static | Dịch vụ tĩnh dành cho hộ gia đình (IP chuyên dụng). |
mobile | Di động / LTE, chuyên dụng. |
mobile_shared | Di động / LTE, nguồn tài nguyên chung. |
dc_static | Trung tâm dữ liệu tĩnh. |
none | Kết nối trực tiếp, không qua proxy. |
Chọn một vị trí bằng proxy_geo (country_code / region / city). Khám phá những gì bạn đã mua mà không cần phải tìm kiếm ID của các nhóm:
curl "http://localhost:8000/api/v1/proxies/available?proxy_type=res_rotating" curl "http://localhost:8000/api/v1/proxies/countries"
CYBERYOZH_API_KEY trong trình thu thập dữ liệu .env. Hãy lấy một proxy tại app.cyberyozh.com/api-access, sau đó khởi động lại container.Preset
Một cài đặt sẵn bao gồm một cấu hình yêu cầu + mẫu URL + công thức phân tích, nhờ đó bạn có thể trích xuất dữ liệu từ một trang web chỉ bằng cách nhập tên trang web thay vì phải tự tay xây dựng yêu cầu. Các cài đặt sẵn được tích hợp sẵn cho Amazon, Google, eBay, Walmart, YouTube và LinkedIn; bạn cũng có thể tự tạo cài đặt sẵn của riêng mình (dựa trên CSS/XPath xác định hoặc do AI tạo ra).
curl -X POST http://localhost:8000/api/v1/scrape/preset/page
-H "Content-Type: application/json"
-d '{
"source": "amazon_product",
"preset_params": { "asin": "B08N5WRWNW" },
"locale": "us",
"llm": { "model": "openai/gpt-5.4-mini" }
}'
# → { "job_id": "..." } then GET /api/v1/scrape/<job_id>/results
llm là tùy chọn. Nếu không có tham số này, trình phân tích cú pháp xác định sẽ chạy độc lập; nếu có, các bộ chọn sẽ tự động khắc phục lỗi khi một required trường trả về giá trị rỗng. Các khóa của nhà cung cấp (OPENAI_API_KEY / ANTHROPIC_API_KEY / GEMINI_API_KEY / OPENROUTER_API_KEY) nằm ở phía máy chủ trong .env.Quản lý các cài đặt sẵn qua GET /api/v1/presets, GET /api/v1/presets/{name}, và POST /api/v1/presets (tên cài đặt sẵn của người dùng phải bắt đầu bằng user_).
Phiên
Các phiên xác thực do máy chủ quản lý: tạo một phiên, đăng nhập một lần, sau đó truyền thông tin session_id cho bất kỳ quá trình thu thập dữ liệu nào để các trang được tải về bằng cookie đã lưu trữ cùng với trạng thái lưu trữ. Yêu cầu bắt buộc đối với các mục tiêu đã đăng nhập như linkedin_profile cài đặt sẵn.
POST /api/v1/sessions— Tạo. Ghimdevice/proxy_type/proxy_geovà một TTL. Trả về{ session_id, expires_at }.POST /api/v1/sessions/{id}/login— chạy lại một tập lệnh đăng nhập dạng khai báo vớicredstrong phần nội dung:{ script, creds }.POST /api/v1/scrape/pagevớisession_idset — thu thập dữ liệu đã xác thực.DELETE /api/v1/sessions/{id}— dọn dẹp.
# 1. create → {"session_id":"sess_...","expires_at":...}
curl -X POST http://localhost:8000/api/v1/sessions
-H "Content-Type: application/json"
-d '{ "device": "desktop", "proxy_type": "res_rotating" }'
# 2. log in (declarative DSL + creds)
curl -X POST http://localhost:8000/api/v1/sessions/sess_.../login
-H "Content-Type: application/json"
-d '{ "script": { "steps": [ {"op":"goto","url":"https://site/login"} ] },
"creds": { "username": "...", "password": "..." } }'
# 3. scrape with the session
curl -X POST http://localhost:8000/api/v1/scrape/page
-H "Content-Type: application/json"
-d '{ "url": "https://site/secure", "session_id": "sess_...", "raw_html": true }'
session_id và cookies cộng lại → 422. Dữ liệu thu thập device / proxy_type / proxy_pool_id / proxy_geo phải khớp với các giá trị được ghim của phiên. Đối với CAPTCHA / 2FA mà DSL đăng nhập không thể giải quyết, hãy bỏ qua tập lệnh và thay vào đó chèn cookie vào phiên.Trích xuất dữ liệu theo lô
Gửi nhiều trang trong một tác vụ bằng cách sử dụng POST /api/v1/scrape/pages — mỗi mục là một yêu cầu thu thập dữ liệu đầy đủ. Kiểm tra trạng thái và lấy kết quả thông qua các điểm cuối của cùng một tác vụ.
curl -X POST http://localhost:8000/api/v1/scrape/pages
-H "Content-Type: application/json"
-d '{
"pages": [
{ "url": "https://example.com", "proxy_type": "none" },
{ "url": "https://example.org", "proxy_type": "none" }
]
}'
session_id áp dụng cho mọi trang trong lô (sẽ bị từ chối với mã trạng thái 422 nếu một trang đã gắn một trang khác).MCP
Công cụ trích xuất này triển khai một điểm cuối của Giao thức Bối cảnh Mô hình (Model Context Protocol) tại /mcp (Streamable HTTP). Chỉ cần di chuột hoặc đặt con trỏ vào đó, các công cụ sẽ tự động xuất hiện:
run_scrape_pagerun_scrape_pagesget_job_statusget_job_resultcancel_scrape_jobhealth
"yozh-scraper": {
"type": "http",
"url": "http://localhost:8000/mcp"
}
Sau đó, chỉ cần yêu cầu: "Trích xuất dữ liệu từ https://example.com và cho tôi biết trên trang đó có những gì." Điểm cuối này cũng hoạt động khi được gọi từ một tác nhân LangChain hoặc một nút n8n MCP Client Tool.
Tài liệu tham khảo về cấu hình
Yêu cầu — ScrapeRequest (đã chọn)
| Trường | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
url | chuỗi (URL) | bắt buộc | Trang cần hiển thị và trích xuất dữ liệu. |
render | bool | true | Hiển thị bằng trình duyệt (cần thiết cho các trang được xây dựng bằng JavaScript). |
wait_until | domcontentloaded · networkidle | domcontentloaded | Khi trang được coi là đã sẵn sàng. |
wait_for_selector | chuỗi · null | null | Chờ cho đến khi xuất hiện một phần tử cụ thể trước khi chụp. |
device | desktop · mobile | desktop | Khung xem / Hồ sơ trình duyệt. |
proxy_type | Xem phần “Proxies” | none | Nhóm máy chủ proxy mà các tuyến truy xuất đi qua. |
proxy_geo | ProxyGeo · null | null | Nhắm mục tiêu theo quốc gia / khu vực / thành phố. |
session_id | chuỗi · null | null | Sử dụng phiên đã được xác thực — xem phần Phiên. |
stealth | bool | true | Áp dụng các biện pháp tăng cường bảo mật chống phát hiện. |
block_assets | bool · null | env | Chặn hình ảnh/phông chữ/tệp đa phương tiện để tăng tốc độ (sẽ chuyển sang sử dụng BLOCK_ASSETS). |
extract | ExtractRule · null | null | Quy tắc trường CSS/XPath → có cấu trúc data. |
raw_html | bool | false | Vui lòng bao gồm toàn bộ mã HTML sau khi hiển thị. |
screenshot | bool | false | Chụp ảnh dưới dạng tệp PNG toàn trang (base64). |
Tham khảo API
| Phương thức | Đường dẫn | Mục đích |
|---|---|---|
| POST | /api/v1/scrape/page | Trích xuất dữ liệu từ một trang. Trả về {"job_id":"…"}. |
| POST | /api/v1/scrape/pages | Trích xuất hàng loạt nhiều trang trong một tác vụ. |
| POST | /api/v1/scrape/preset/page | Trích xuất theo tên cài đặt sẵn (Amazon, Google, …). |
| GET | /api/v1/scrape/{id} | Trạng thái công việc (đang chờ xử lý/đang chạy/đã hoàn thành/…). |
| GET | /api/v1/scrape/{id}/results | Kết quả tìm kiếm (trang + ScrapeResponse). |
| DELETE | /api/v1/scrape/{id} | Hủy nhẹ — các trang trong chuyến bay đã kết thúc. |
| POST | /api/v1/sessions | Tạo một phiên đăng nhập đã được xác thực. |
| POST | /api/v1/sessions/{id}/login | Chạy một tập lệnh đăng nhập theo kiểu khai báo. |
| DELETE | /api/v1/sessions/{id} | Xóa một phiên làm việc. |
| GET | /api/v1/proxies/available | Liệt kê các proxy đã mua thuộc một loại nhất định. |
| GET | /api/v1/presets | Danh sách các cài đặt sẵn có sẵn và do người dùng tạo. |
| GET | /api/v1/health | Sức khỏe + số lượng nhân viên. |
Các chi tiết quan trọng
CYBERYOZH_API_KEY trong trình thu thập dữ liệu .env. Nếu không có khóa này, chỉ proxy_type: none (trực tiếp) mới hoạt động.session_id và cookies sẽ trả về mã trạng thái 422, và yêu cầu phải khớp với phiên đã được ghim device / proxy_type / proxy_geo.OPENAI / ANTHROPIC / GEMINI / OPENROUTER) từ .env — không bao giờ được gửi bởi client.