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 / Các trường hợp sử dụng / Thu thập dữ liệu từ web & Phân tích
Trường hợp sử dụng · Trích xuất dữ liệu từ web

Dữ liệu web công khai, được cấu trúc theo chuẩn SQL

Nhập bất kỳ trang công khai hoặc toàn bộ trang web nào vào kho dữ liệu của bạn dưới dạng JSON đã được làm sạch: tin tuyển dụng, tin tức, đánh giá, danh mục sản phẩm, hồ sơ công khai. Yozh xử lý các bộ chọn, chống bot, thử lại và proxy — các trình nạp dữ liệu của bạn chỉ cần ghi thêm dữ liệu vào Snowflake, BigQuery hoặc Postgres.

$curl -s :8000/api/v1/scrape/batch -d @urls.json | jq -c '.results[]' | psql -c "COPY raw FROM stdin"
batch: g2.com/products
Target table
scraped_pages
Batch
200 urls 8 workers 1.0/s
Status
streaming · 247 / 200 rows
Yozh batch /scrape/batch
Pulling URL batch
Stealth fetch + retry
Parsing & normalizing
Emitting JSON-lines
COPY FROM stdin
Đưa vào các lớp của bạn
Tại sao hầu hết các đường ống lại bị mục nát

Các công cụ thu thập dữ liệu tự làm chiếm tới 90% thời gian phân tích và tạo ra dữ liệu không chính xác

Một “tập lệnh Python nhỏ” lại biến thành hàng tháng trời phải xoay vòng cookie, luân phiên proxy, sửa lỗi bộ chọn, xếp hàng thử lại và những lần nhận thông báo khẩn lúc 3 giờ sáng chỉ vì nguồn đã thay đổi tên một lớp. Đội ngũ dữ liệu phải dành cả quý để xây dựng lại cơ sở hạ tầng thay vì phát triển các bảng điều khiển. Chúng tôi cung cấp sẵn bốn thành phần mà mọi đội ngũ đều phải xây dựng lại từ đầu — ngay khi triển khai.

Nếu kho hàng của bạn có số cột nhiều hơn nullhàng so với số hàng sau khi thiết kế lại nguồn — thì bài viết này dành cho bạn.

Những chiếc cạo tự chế dễ vỡ sẽ mục nát chỉ trong vòng một quý

Vấn đề là: Một đoạn mã Python viết vội vào cuối tuần lại biến thành một hệ thống nội bộ dễ hỏng: một hàng đợi ở chỗ này, một lớp xử lý thử lại ở chỗ kia, không có khả năng giám sát, và một bộ chọn CSS bị lỗi mỗi khi thiết kế nguồn được thay đổi. Đội ngũ phải quản lý một hệ thống cơ sở hạ tầng mà họ vốn không bao giờ muốn phải viết.

Cách Yozh Scraper khắc phục vấn đề này. Hệ thống sẵn sàng cho môi trường sản xuất: bộ thực thi hàng loạt song song, tự động thử lại với cơ chế lùi dần theo cấp số nhân, mã lỗi có cấu trúc và tính năng tự phục hồi của LLM giúp tái tạo các bộ chọn bị hỏng từ DOM đang hoạt động. Chỉ một docker compose up thay thế hàng tháng trời viết mã kết nối.

  • LLM tự khắc phục
  • Batch + thử lại
  • Lỗi có cấu trúc

Mã HTML lộn xộn trong mọi tệp nguồn

Vấn đề nằm ở chỗ: Mỗi trang web đều trả về một cấu trúc độc nhất vô nhị gồm các thẻ div lồng nhau, các khối JSON không được tài liệu hóa và các định dạng ngày tháng không thống nhất. Các trình tải dữ liệu của bạn cần một bước chuẩn hóa trước khi đưa vào kho dữ liệu — và bước này luôn là thứ đầu tiên bị gián đoạn mỗi khi nguồn dữ liệu triển khai một thiết kế mới.

Cách Yozh Scraper khắc phục vấn đề này. Các cài đặt sẵn tích hợp sẵn đảm bảo cấu trúc JSON giống hệt nhau trên các nguồn dữ liệu — cùng các khóa, định dạng ngày theo tiêu chuẩn ISO, đơn vị tiền tệ được chuẩn hóa theo vùng. Nguồn dữ liệu tùy chỉnh? POST /api/v1/presets/generate chỉ cần một URL ví dụ — mô hình ngôn ngữ lớn (LLM) sẽ suy luận cấu trúc và tạo các bộ chọn. Có thể tích hợp trực tiếp vào COPY ... FROM stdin.

  • Cùng cấu trúc JSON
  • Ngày định dạng ISO
  • Preset do LLM tạo

Cuộc chiến chống bot đã làm tiêu tốn thời gian của chặng đua nước rút

Vấn đề nằm ở chỗ: Các proxy trung tâm dữ liệu bị quá tải chỉ sau một phiên làm việc, các rào cản CAPTCHA chặn quá trình thu thập dữ liệu ngay giữa chừng, còn kỹ thuật nhận dạng dấu vân tay TLS phát hiện trình duyệt không giao diện người dùng chỉ trong vài giây. Các kỹ sư dữ liệu cuối cùng phải dành thời gian xử lý các sự cố chặn truy cập thay vì tập trung vào việc xây dựng bảng điều khiển. Chi phí proxy tăng vọt trong khi khối lượng dữ liệu lại bị đình trệ.

Cách Yozh Scraper khắc phục vấn đề này. Tích hợp sẵn với CyberYozh App Proxy thông qua CYBERYOZH_API_KEY — 5 loại proxy (dân cư luân phiên/cố định, di động 4G/5G, trung tâm dữ liệu, ISP) trên 250 mã quốc gia. Phiên bản Chromium ẩn danh với dấu vân tay ấm tự động khớp với nguồn gốc proxy. Hầu hết các luồng truy cập không bao giờ gặp CAPTCHA.

  • 5 loại proxy
  • 250 mã quốc gia
  • Fingerprint đã làm ấm

Điều phối thu thập dữ liệu theo từng trường hợp cụ thể

Vấn đề nằm ở chỗ: “Duyệt qua trang web này, trích xuất dữ liệu từ mọi trang sản phẩm, theo dõi các URL mới” là một tác vụ hợp lý — nhưng khi chuyển thành mã nguồn, nó lại bao gồm một hàng đợi, một bảng loại trừ trùng lặp, các quy tắc phạm vi, giới hạn RPS và cơ chế hủy hai giai đoạn. Nếu được triển khai thủ công, hệ thống sẽ gặp sự cố khi phải thực hiện lại các lần thử và âm thầm trích xuất lại dữ liệu từ cùng một URL.

Cách Yozh Scraper khắc phục vấn đề này. Yozh Crawler quét trang web ở phía máy chủ, loại bỏ trùng lặp thông qua hàm băm SHA1 cho từng tác vụ, truyền các URL mới qua SSE và kết nối trực tiếp với trình trích xuất dữ liệu mỗi khi tìm thấy kết quả trùng khớp. Hệ thống hủy hai giai đoạn (mềm → bắt buộc). Truyền luồng dữ liệu trực tiếp vào Airflow / dbt / cron — việc điều phối vẫn được thực hiện trong các công cụ mà bạn đang sử dụng.

  • Streaming qua SSE
  • Khử trùng lặp theo job
  • Airflow / dbt / cron
Cách thức hoạt động

Từ trang web thô đến hàng hóa trong kho — chỉ trong 3 bước

Chỉ cần trích xuất một điểm cuối, tải một định dạng. Kết nối Yozh trực tiếp với trình tải dữ liệu, trình điều phối và kho dữ liệu hiện có của bạn — không cần lớp trung gian.

1 Khởi động động cơ

Sao chép kho lưu trữ và docker compose up. Công cụ thu thập dữ liệu :8000, trình thu thập dữ liệu đang hoạt động :8001. Không cần tài khoản SaaS, không cần trình hướng dẫn tạo khóa API — chạy trên VPC của bạn.

# one-time setup
git clone 
  github.com/CyberYozh-data/yozh-scraper
cd yozh-scraper
docker compose up -d
2 Trích xuất hàng loạt danh sách URL

Gửi (POST) lô URL của bạn (tối đa 200 mỗi lần gọi). Các worker chạy song song, việc thử lại và proxy được xử lý ở phía máy chủ. Cùng một cấu trúc JSON trên mọi nguồn.

curl 
  localhost:8000/api/v1/scrape/batch 
  -X POST 
  -d '{"urls": ["…", "…"],
       "preset": "auto",
       "concurrency": 8}'
3 Đưa thẳng vào kho của bạn

Kết quả được trả về dưới dạng các dòng JSON. Chuyển tiếp qua jq vào COPY ... FROM stdin trên Postgres, hoặc tải trực tiếp qua ứng dụng khách Snowflake / BigQuery. Không cần phần mềm trung gian.

# postgres example
curl :8000/api/v1/scrape/batch 
  -d @urls.json 
| jq -c '.results[]' 
| psql -c "COPY raw FROM stdin"
Ví dụ trực tiếp

Lợi ích bạn nhận được — một mẫu thiết kế, phù hợp với mọi nền tảng thương mại điện tử

Hãy chọn một cài đặt sẵn để xem phản hồi trông như thế nào. Bộ trường có thể khác nhau tùy theo nguồn, nhưng cấu trúc yêu cầu là giống hệt nhau.


            
Công thức

Cách các nhóm dữ liệu triển khai hệ thống — mỗi nhóm chỉ trong 10 dòng

Ba đường ống dữ liệu từ trang này đến kho, đã sẵn sàng để dán vào. Yozh lo phần trích xuất — người điều phối của bạn lo phần lịch trình.

1 Bản tóm tắt hàng ngày → Postgres

Cron lấy danh sách URL, thực hiện thu thập dữ liệu theo lô và truyền các dòng JSON trực tiếp vào bảng tạm. dbt sẽ tiếp nhận dữ liệu này ở giai đoạn sau.

# crontab: every day at 06:00
0 6 * * * /usr/local/bin/snapshot.sh

# snapshot.sh
curl -s :8000/api/v1/scrape/batch 
  -d "@urls.json" 
| jq -c '.results[]' 
| psql -c "COPY raw_scrape FROM stdin"

# dbt build runs next in Airflow DAG
dbt build --select staging.raw_scrape+
200 URLs/batch COPY FROM stdin cron / Airflow của bạn
2 Quá trình thu thập dữ liệu khám phá → BigQuery

Thực hiện thu thập dữ liệu trang web, truyền các URL mới ngay khi chúng được phát hiện. Loại bỏ các bản trùng lặp so với dữ liệu ngày hôm qua, chỉ trích xuất các thay đổi mới, và chèn các hàng vào BigQuery ngay khi chúng được nhận.

# stream discovered URLs over SSE
curl -N :8001/api/v1/crawl/start 
  -d '{"seed_url":"site.com",
       "scope":"same-domain",
       "max_pages":1000}' 
| jq -r 'select(.event=="found") | .url' 
| comm -13 yesterday.txt - 
| bq insert dataset.urls --source_format=NEWLINE_DELIMITED_JSON
Streaming qua SSE khử trùng lặp theo job (SHA1) chỉ chèn delta
3 Dòng tin tức → Kafka

Thu thập và trích xuất dữ liệu từ các nguồn tin tức, đăng tải từng bài báo dưới dạng một sự kiện Kafka. Các hệ thống tiêu thụ dữ liệu ở giai đoạn sau (bảng điều khiển, mô hình phân tích cảm xúc, hệ thống cảnh báo) đăng ký nhận dữ liệu theo chủ đề.

# 1. continuous crawl of source list
curl -N :8001/api/v1/crawl/start 
  -d "@sources.json" 
| jq -c 'select(.event=="scraped") | .result' 
| kcat -P -t news.raw -b kafka:9092

# 2. consumers subscribe downstream
kcat -C -t news.raw | your-pipeline
chuỗi trích xuất + đăng tải Kafka producer mỗi nguồn một topic
FAQ

Các câu hỏi thường gặp về việc trích xuất dữ liệu vào kho

Tôi có thể thu thập dữ liệu từ những nguồn nào?
Bất kỳ trang công khai nào. Các cài đặt sẵn tích hợp sẵn đã bao quát các trang có lưu lượng truy cập cao nhất — các sàn thương mại điện tử, công cụ tìm kiếm, YouTube, hồ sơ LinkedIn (kèm theo phiên truy cập). Đối với các nguồn tùy chỉnh, hãy gọi POST /api/v1/presets/generate với một URL mẫu — mô hình ngôn ngữ lớn (LLM) sẽ suy luận cấu trúc và tạo các bộ chọn, bạn sẽ nhận được một cài đặt sẵn có thể tái sử dụng chỉ trong vài giây. Đối với các trang riêng lẻ, POST /scrape/page với lược đồ được chỉ định rõ ràng extract: {...} sẽ hoạt động mà không cần bất kỳ cài đặt sẵn nào. Tệp robots.txt được tuân thủ theo mặc định; hãy tuân thủ quy tắc này đối với các nguồn mà bạn không sở hữu.
Làm thế nào để nhập dữ liệu vào Snowflake / BigQuery / Postgres?
Công cụ thu thập dữ liệu trả về các dòng JSON cho mỗi lô và các luồng SSE cho mỗi lần thu thập. Truyền trực tiếp vào trình nạp dữ liệu kho dữ liệu của bạn: jq -c '.results[]' | psql -c "COPY raw FROM stdin" đối với Postgres, bq insert đối với BigQuery, snowsql --query "PUT ..." + COPY INTO đối với Snowflake, hoặc ghi vào S3/GCS và để Snowpipe hiện có hoặc bảng bên ngoài của bạn tự động thu thập dữ liệu. Không cần duy trì trình kết nối tùy chỉnh — chỉ đơn giản là JSON qua HTTP.
Tôi có thể chạy ứng dụng này trong VPC của mình không?
Đúng vậy — Yozh là dịch vụ tự lưu trữ. docker compose up Nó mang theo hai container (scraper + crawler) vào bất kỳ mạng nào bạn cung cấp: VPC, on-prem, hoặc mạng cách ly hoàn toàn. Không có kết nối về máy chủ chính, không phụ thuộc vào SaaS. Lưu lượng đi ra được chuyển đến các mục tiêu mà bạn thu thập dữ liệu (và tùy chọn đến CyberYozh App Proxy nếu bạn kích hoạt tính năng này). Nhật ký, dấu vết và số liệu vẫn được lưu trữ tại nơi bạn đặt chúng — điểm cuối Prometheus tại /metrics, nhật ký JSON có cấu trúc được ghi ra stdout.
Cơ chế hoạt động của các lần thử lại, lỗi và khả năng quan sát diễn ra như thế nào?
Mỗi yêu cầu đều được cấp một ngân sách thử lại theo cơ chế lùi thời gian theo cấp số nhân (có thể cấu hình cho từng cuộc gọi). Các trường hợp thất bại sẽ trả về mã lỗi có cấu trúc — BLOCKED, CAPTCHA, SELECTOR_FAIL, UPSTREAM_TIMEOUT — nhờ đó trình tải của bạn có thể xử lý các trường hợp này thay vì phải phân tích chuỗi ký tự. Khi một selector bị hỏng sau khi thiết kế lại nguồn, tính năng tự phục hồi của LLM sẽ tái tạo nó ngay lập tức (chuyển llm: {model: "..."}) và gắn thẻ phản hồi với self_heal: true để phục vụ cho việc kiểm toán ở các giai đoạn sau. Các chỉ số Prometheus về độ sâu hàng đợi, tỷ lệ thành công và độ trễ proxy được tích hợp sẵn.
Nó tương thích như thế nào với Airflow / dbt / Temporal?
Yozh đảm nhận việc thu thập dữ liệu; trình điều phối của bạn đảm nhận việc lên lịch. Mô hình đơn giản nhất: một Airflow BashOperator (hoặc PythonOperator với requests) gọi /scrape/batch, chuyển kết quả vào một bảng tạm, sau đó nối tiếp một tác vụ dbt ở phía sau. Quá trình thu thập dữ liệu trả về một luồng SSE — hãy sử dụng một tác vụ chạy dài hoặc chia nó thành các phần có thể tiếp tục thông qua job_id. Không có bộ lập lịch đi kèm đồng nghĩa với việc không bị ràng buộc: hãy sử dụng bất kỳ nền tảng dữ liệu nào mà hệ thống của bạn đang vận hành.
Nguồn mở · Giấy phép MIT · 84 ★

Bạn đã sẵn sàng đưa dữ liệu web vào kho dữ liệu của mình chưa?

Chỉ cần một tệp Docker Compose, một luồng dữ liệu JSON-lines, mọi nguồn dữ liệu đều được chuẩn hóa — và được truyền trực tiếp vào Snowflake, BigQuery, Postgres, Kafka. Miễn phí. Mãi mãi. Hãy đánh dấu sao cho chúng tôi nếu công cụ này hữu ích — mỗi lượt đánh dấu sao đều rất quan trọng.

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

Đượ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