84 sao trên GitHub và con số này vẫn đang tiếp tục tăng. Yozh Crawler + Scraper là phần mềm miễn phí, mã nguồn mở và được phát triển công khai — hãy nhấn sao cho chúng tôi nếu công cụ này xứng đáng có một vị trí trong hệ thống công nghệ của bạn.
CyberYozh Data / Yozh Scraper
Phần mềm · Yozh Scraper

Chỉ cần nhập một URL, nhận lại dữ liệu có cấu trúc rõ ràng

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. Tích hợp sẵn các máy chủ proxy CyberYozh (chế độ ẩn danh theo mặc định), các cài đặt sẵn cho các trang web lớn và các phiên đăng nhập đã xác thực. Không phải dịch vụ SaaS, chạy trên :8000.

$curl -X POST :8000/api/v1/scrape/page -d '{"url":"https://site.com", "proxy_type":"res_rotating","extract":{"type":"css","fields":{...}}}'

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.
URL gốchttp://localhost:8000
Tài liệu OpenAPIhttp://localhost:8000/docs
Điểm cuối MCPhttp://localhost:8000/mcp
Hoạt động kết hợp với Yozh Crawler. Trình 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):

bash
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:

bash
curl http://localhost:8000/api/v1/health
# {"status":"ok","workers":2}
Các máy chủ proxy cần có khóa API — hãy thiết lập 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
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):

JSON
{
  "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 queuedrunningdone (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
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ườngKiểuMặc địnhMô tả
selectorstringbắt buộcBộ chọn CSS hoặc biểu thức XPath cho trường này.
attrstringtextNên đọc gì — text hoặc tên thuộc tính (ví dụ: href, src).
allboolfalseTrả 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.
requiredboolfalseBá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
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 }'
Ảnh chụp màn hình sẽ kích hoạt quá trình cuộn để tải các hình ảnh được tải chậm. Nếu bạn cũng sử dụng 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_rotatingChế độ xoay dành cho khu dân cư — cài đặt mặc định được khuyến nghị.
res_staticDịch vụ tĩnh dành cho hộ gia đình (IP chuyên dụng).
mobileDi động / LTE, chuyên dụng.
mobile_sharedDi động / LTE, nguồn tài nguyên chung.
dc_staticTrung tâm dữ liệu tĩnh.
noneKế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
curl "http://localhost:8000/api/v1/proxies/available?proxy_type=res_rotating"
curl "http://localhost:8000/api/v1/proxies/countries"
Các máy chủ proxy yêu cầu 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
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.

  1. POST /api/v1/sessions — Tạo. Ghim device / proxy_type / proxy_geo và một TTL. Trả về { session_id, expires_at }.
  2. 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ới creds trong phần nội dung: { script, creds }.
  3. POST /api/v1/scrape/page với session_id set — thu thập dữ liệu đã xác thực.
  4. DELETE /api/v1/sessions/{id} — dọn dẹp.
cURL
# 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_idcookies 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
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" }
    ]
  }'
Một thẻ cấp cao nhất 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_page
  • run_scrape_pages
  • get_job_status
  • get_job_result
  • cancel_scrape_job
  • health
~/.claude/settings.json
"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ườngKiểuMặc địnhMô tả
urlchuỗi (URL)bắt buộcTrang cần hiển thị và trích xuất dữ liệu.
renderbooltrueHiể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_untildomcontentloaded · networkidledomcontentloadedKhi trang được coi là đã sẵn sàng.
wait_for_selectorchuỗi · nullnullChờ cho đến khi xuất hiện một phần tử cụ thể trước khi chụp.
devicedesktop · mobiledesktopKhung xem / Hồ sơ trình duyệt.
proxy_typeXem phần “Proxies”noneNhóm máy chủ proxy mà các tuyến truy xuất đi qua.
proxy_geoProxyGeo · nullnullNhắm mục tiêu theo quốc gia / khu vực / thành phố.
session_idchuỗi · nullnullSử dụng phiên đã được xác thực — xem phần Phiên.
stealthbooltrueÁp dụng các biện pháp tăng cường bảo mật chống phát hiện.
block_assetsbool · nullenvChặ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).
extractExtractRule · nullnullQuy tắc trường CSS/XPath → có cấu trúc data.
raw_htmlboolfalseVui lòng bao gồm toàn bộ mã HTML sau khi hiển thị.
screenshotboolfalseChụp ảnh dưới dạng tệp PNG toàn trang (base64).

Tham khảo API

Phương thứcĐường dẫnMục đích
POST/api/v1/scrape/pageTrích xuất dữ liệu từ một trang. Trả về {"job_id":"…"}.
POST/api/v1/scrape/pagesTrích xuất hàng loạt nhiều trang trong một tác vụ.
POST/api/v1/scrape/preset/pageTrí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}/resultsKế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/sessionsTạo một phiên đăng nhập đã được xác thực.
POST/api/v1/sessions/{id}/loginChạ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/availableLiệt kê các proxy đã mua thuộc một loại nhất định.
GET/api/v1/presetsDanh sách các cài đặt sẵn có sẵn và do người dùng tạo.
GET/api/v1/healthSức khỏe + số lượng nhân viên.

Các chi tiết quan trọng

Các máy chủ proxy cần có khóa API. Hãy thiết lập 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.
Các tác vụ không đồng bộ, chạy trong bộ nhớ. Mỗi lần thu thập dữ liệu đều là một tác vụ chạy nền; kho dữ liệu được lưu trữ trong bộ nhớ và sẽ được đặt lại khi khởi động lại container. Bạn có thể lấy kết quả ngay khi chúng có sẵn, hoặc tự lưu trữ chúng.
Các phiên làm việc được xác định duy nhất bằng cookie. Khi truyền cả hai session_idcookies 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.
Tính năng tự phục hồi của LLM được thực hiện ở phía máy chủ. Tính năng tự phục hồi được cài đặt sẵn sử dụng các khóa của nhà cung cấp (OPENAI / ANTHROPIC / GEMINI / OPENROUTER) từ .env — không bao giờ được gửi bởi client.

Được các đội ngũ phân tích dữ liệu và các nhà phát triển AI yêu thích

Những người đang phát triển ứng dụng với Yozh nói gì

5,0 / 5 · Đánh giá 5
GitHub
Chỉ trong một buổi chiều, chúng tôi đã thay thế cụm Playwright nội bộ bằng Yozh. Điểm cuối MCP được tích hợp trực tiếp vào tác nhân Claude của chúng tôi — không cần viết mã kết nối, trình thu thập dữ liệu và trình trích xuất dữ liệu đều hoạt động ngay lập tức.
Marcus Reinhardt Kỹ sư Dữ liệu Trưởng Northwind Analytics
X
Hệ thống cài đặt sẵn chính là tính năng nổi bật nhất. Chúng tôi chỉ cần truyền vào tên nguồn là sẽ nhận lại được dữ liệu JSON đã được làm sạch; tính năng tự khắc phục lỗi thậm chí còn phát hiện ra hai thay đổi về bố cục của Amazon trước khi chúng tôi kịp nhận ra.
Priya Nair Người sáng lập ScrapeStack
Reddit
Cuối cùng thì cũng có một công cụ thu thập dữ liệu mã nguồn mở coi các máy chủ proxy và phiên làm việc là yếu tố then chốt. Chúng tôi triển khai công cụ này để truy cập các cổng thông tin đối tác có yêu cầu đăng nhập — các phiên làm việc được duy trì và kết quả luôn nhất quán trên các khu vực.
Daniel Osei Kỹ sư hệ thống phía máy chủ Loopfeed
X
Sau khi kết nối với Cursor qua MCP, hiện tại agent của tôi có thể lấy dữ liệu web thời gian thực ngay trong quá trình thực hiện tác vụ. Tính năng thu thập dữ liệu theo thời gian thực qua SSE chính là điều mà các quy trình làm việc của agent còn thiếu.
Elena Kovac Kỹ sư Trí tuệ nhân tạo Vektor Labs
GitHub
Chúng tôi đã ngừng sử dụng một API trích xuất dữ liệu trả phí để cắt giảm chi phí và chuẩn bị tinh thần cho việc chất lượng dịch vụ sẽ giảm sút — nhưng kết quả lại hoàn toàn ngược lại. Hệ thống tự vận hành, không tính phí theo từng yêu cầu, và cấu trúc dữ liệu đầu ra còn gọn gàng hơn so với dịch vụ mà trước đây chúng tôi phải trả tiền để sử dụng.
Sofia Almeida Trưởng phòng Kỹ thuật Tabbly
Nguồn mở · Giấy phép MIT · 84 ★

Xử lý một URL. Nhận lại dữ liệu đã được lọc

Yozh Scraper là công cụ hiển thị (rendering engine) đứng sau toàn bộ hệ thống — một docker compose up và bạn sẽ có các tính năng proxy, ẩn danh, cài đặt sẵn, phiên làm việc và trích xuất, sẵn sàng tích hợp với MCP, trên chính hạ tầng của bạn. Miễn phí. Mãi mãi.

Yozh Scraper + Crawler được phân phối theo giấy phép MIT. Hãy sử dụng nó. Hãy tạo nhánh từ nó. Hãy phát triển dựa trên nó.