
Tóm tắt nhanh
- AnyCrawl là công cụ crawler mã nguồn mở (Node.js/TypeScript) thiết kế chuyên biệt để làm sạch dữ liệu web cho AI.
- Tính năng nổi bật: Chuyển đổi HTML sang Markdown/JSON, trích xuất kết quả tìm kiếm (SERP) từ Google/Bing, và hỗ trợ JSON Schema.
- Hiệu năng: Xử lý đa luồng (multi-threading) tự nhiên, nhanh hơn 5-10 lần so với các giải pháp tuần tự.
- Phù hợp nhất cho: Các kỹ sư AI xây dựng hệ thống RAG, dataset cho LLM, hoặc theo dõi thứ hạng SEO.
AnyCrawl là gì?
AnyCrawl là một crawler hiện đại được xây dựng trên nền tảng Node.js và TypeScript, với mục tiêu cung cấp dữ liệu đầu vào sạch, có cấu trúc cho các hệ sinh thái AI. Khác với các thư viện cào dữ liệu truyền thống, AnyCrawl tập trung giải quyết bài toán hậu xử lý: tự động loại bỏ các thành phần nhiễu (noise) của HTML và định dạng lại nội dung để sẵn sàng đưa vào context của các mô hình ngôn ngữ lớn (LLM).
Được phát triển bởi đội ngũ Any4AI dưới giấy phép MIT, công cụ này hiện đã đạt hơn 2.1k stars trên GitHub.
Thông tin dự án:
- GitHub:
https://github.com/any4ai/AnyCrawl - Website:
https://anycrawl.dev
Tại sao dev nên chọn AnyCrawl?
Lý do chính để sử dụng AnyCrawl thay vì tự xây dựng script với Selenium hay Puppeteer là khả năng chuẩn hóa dữ liệu đầu ra và tích hợp sẵn API tìm kiếm.
Thiết kế “LLM-First”
AnyCrawl được tối ưu hóa để output có thể sử dụng ngay lập tức cho AI.
- Tự động chuyển đổi HTML thành Markdown sạch.
- Hỗ trợ JSON Schema extraction: Bạn định nghĩa cấu trúc, crawler trả về đúng key-value đó.
- Giảm thiểu đáng kể công đoạn tiền xử lý (preprocessing) dữ liệu.
Hỗ trợ SERP (Search Engine Result Page)
Đây là tính năng hiếm thấy ở các open-source crawler. AnyCrawl cho phép bạn lấy kết quả tìm kiếm từ Google, Bing, Baidu thông qua một API call đơn giản mà không cần xử lý CAPTCHA hay phân tích HTML phức tạp.
// Một dòng code, bạn có toàn bộ SERP từ Google
const results = await anycrawl.search({
query: "best LLM frameworks 2026",
engine: "google",
pages: 2
});Hiệu suất đa luồng (Multi-Threading)
Công cụ này xử lý các tác vụ hàng loạt (bulk tasks) bằng cơ chế multi-threading native. Thay vì spawn process riêng lẻ tốn tài nguyên, AnyCrawl tối ưu hóa luồng chạy giúp tốc độ nhanh hơn 5-10 lần so với cách cào tuần tự truyền thống.
Các chế độ hoạt động chính
AnyCrawl cung cấp ba endpoint chính tương ứng với ba nhu cầu thu thập dữ liệu phổ biến hiện nay.
1. SCRAPE – Trích xuất dữ liệu đơn lẻ
Chế độ này dùng để lấy nội dung từ một URL cụ thể và chuyển đổi sang Markdown hoặc JSON. Nó phù hợp khi bạn cần lấy thông tin chi tiết từ một trang đích (landing page) hoặc bài viết cụ thể.
2. CRAWL – Quét toàn bộ website
AnyCrawl sẽ đi theo các liên kết nội bộ để lập chỉ mục (index) toàn bộ website.
- Ứng dụng: Xây dựng chatbot RAG học từ toàn bộ tài liệu kỹ thuật (documentation) hoặc blog.
- Tính năng kiểm soát: Hỗ trợ
max_depth(độ sâu),include_paths/exclude_paths(lọc đường dẫn) và tự động xử lý phân trang.
3. SEARCH – Thu thập kết quả tìm kiếm
Chế độ này biến AnyCrawl thành một công cụ SEO monitoring hoặc nghiên cứu thị trường. Bạn có thể tìm kiếm từ khóa trên các search engine và nhận về danh sách tiêu đề, mô tả, URL và vị trí xếp hạng.
Hướng dẫn cài đặt và Quick Start
Để bắt đầu, bạn cần cài đặt môi trường Node.js (phiên bản 18 trở lên) và sử dụng pnpm để quản lý gói nhằm đạt hiệu suất tốt nhất.
Bước 1: Clone Repo và cài đặt dependencies
git clone https://github.com/any4ai/AnyCrawl.git
cd AnyCrawl
# Cài pnpm nếu chưa có
npm install -g pnpm
# Cài dependencies
pnpm installBước 2: Cấu hình môi trường
Tạo file .env và thiết lập các thông số cơ bản.
cp .env.example .envNội dung file .env mẫu:
# API Configuration
NODE_ENV=production
ANYCRAWL_PORT=3000
# Database (optional, cho self-hosting)
DATABASE_URL=postgresql://user:password@localhost:5432/anycrawl
# Redis (dùng cho caching và queue)
REDIS_URL=redis://localhost:6379
# Proxy (optional)
ANYCRAWL_PROXY_URL=http://proxy:portBước 3: Khởi động Server
pnpm startServer sẽ mặc định chạy tại http://localhost:3000.
TIPS:
Nếu bạn không muốn tự quản lý hạ tầng (self-hosting), bạn có thể sử dụng phiên bản hosted tại
api.anycrawl.dev. Tuy nhiên, việc tự host sẽ giúp bạn kiểm soát hoàn toàn dữ liệu và không bị giới hạn bởi gói cước của nhà cung cấp.
Ví dụ triển khai Code (Code Examples)
Dưới đây là các kịch bản sử dụng thực tế được viết bằng TypeScript/Node.js.
Ví dụ 1: Cào trang web thành Markdown cho LLM
Kịch bản này rất hữu ích khi bạn muốn feed nội dung web vào ngữ cảnh (context) của ChatGPT hoặc Claude.
import axios from 'axios';
const API_KEY = process.env.ANYCRAWL_API_KEY;
const API_BASE = 'https://api.anycrawl.dev';
// Scrape một trang
async function scrapeToMarkdown(url: string) {
try {
const response = await axios.post(
`${API_BASE}/v1/scrape`,
{
url: url,
engine: 'playwright', // JS rendering
formats: ['markdown'], // Output format
},
{
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
},
}
);
// Kết quả chứa markdown sạch
const markdown = response.data.markdown;
console.log('Markdown Output:');
console.log(markdown);
return markdown;
} catch (error) {
console.error('Error scraping:', error.message);
}
}
// Gọi function
scrapeToMarkdown('https://docs.example.com/getting-started');Ví dụ 2: Trích xuất dữ liệu có cấu trúc (JSON Schema)
Sử dụng khi bạn cần lấy thông tin sản phẩm, giá cả, review theo đúng định dạng database.
import axios from 'axios';
const API_KEY = process.env.ANYCRAWL_API_KEY;
const API_BASE = 'https://api.anycrawl.dev';
async function extractProductData(url: string) {
const schema = {
type: 'object',
properties: {
product_name: { type: 'string' },
price: { type: 'number' },
rating: { type: 'number' },
review_count: { type: 'number' },
description: { type: 'string' },
in_stock: { type: 'boolean' },
},
required: ['product_name', 'price', 'rating'],
};
try {
const response = await axios.post(
`${API_BASE}/v1/scrape`,
{
url: url,
engine: 'playwright',
json_options: {
schema: schema,
},
},
{
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
},
}
);
const productData = response.data.json; // Structured JSON
console.log('Extracted Product Data:');
console.log(JSON.stringify(productData, null, 2));
return productData;
} catch (error) {
console.error('Error extracting data:', error.message);
}
}
// Gọi function
extractProductData('https://example-store.com/product/laptop-pro');Ví dụ 3: Crawl toàn bộ documentation
Tự động duyệt qua tất cả các trang tài liệu để xây dựng kiến thức cho AI.
import axios from 'axios';
const API_KEY = process.env.ANYCRAWL_API_KEY;
const API_BASE = 'https://api.anycrawl.dev';
async function crawlDocsSite(baseUrl: string) {
try {
const response = await axios.post(
`${API_BASE}/v1/crawl`,
{
url: baseUrl,
engine: 'playwright', // Xử lý JS
max_depth: 3, // Giới hạn độ sâu (khôngcào vô hạn)
limit: 100, // Max 100 trang
strategy: 'same-domain', // Chỉ cào same domain
include_paths: ['/docs', '/guide'], // Chỉ include /docs và /guide
exclude_paths: ['/admin', '/settings'], // Loại bỏ admin pages
scrape_options: {
formats: ['markdown'], // Output format
},
},
{
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
},
}
);
// Response chứa status và job ID (crawl chạy async)
console.log('Crawl Job Started:');
console.log(`Job ID: ${response.data.job_id}`);
console.log(`Status: ${response.data.status}`);
// Có thể polling để check status
return response.data;
} catch (error) {
console.error('Error starting crawl:', error.message);
}
}
// Gọi function
crawlDocsSite('https://docs.example.com');Ví dụ 4: Trích xuất SERP từ Google
Giám sát thứ hạng từ khóa hoặc nghiên cứu đối thủ.
import axios from 'axios';
const API_KEY = process.env.ANYCRAWL_API_KEY;
const API_BASE = 'https://api.anycrawl.dev';
async function getGoogleSerpResults(query: string, pages: number = 1) {
try {
const response = await axios.post(
`${API_BASE}/v1/search`,
{
query: query,
engine: 'google',
pages: pages, // Số pages trong search results
lang: 'vi-VN', // Ngôn ngữ Việt Nam
},
{
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
},
}
);
const results = response.data.results;
console.log(`Found ${results.length} results for: "${query}"`);
// Parse results
results.forEach((result, index) => {
console.log(`\n${index + 1}. ${result.title}`);
console.log(` URL: ${result.url}`);
console.log(` Description: ${result.description}`);
console.log(` Position: ${result.position}`);
});
return results;
} catch (error) {
console.error('Error fetching SERP:', error.message);
}
}
// Gọi function
getGoogleSerpResults('best open source AI tools 2026', 2);Ví dụ 5: Xử lý Bulk Scrape (Hàng loạt)
Sử dụng batch processing để tối ưu hóa hiệu năng khi cào số lượng lớn URL.
import axios from 'axios';
const API_KEY = process.env.ANYCRAWL_API_KEY;
const API_BASE = 'https://api.anycrawl.dev';
async function bulkScrapeUrls(urls: string[]) {
try {
// AnyCrawl hỗ trợ batch endpoint
const response = await axios.post(
`${API_BASE}/v1/batch`,
{
requests: urls.map((url) => ({
url: url,
engine: 'cheerio', // Static parsing, nhanh hơn
formats: ['markdown'],
})),
},
{
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
},
}
);
const batchId = response.data.batch_id;
console.log(`Batch job created: ${batchId}`);
console.log(`Processing ${urls.length} URLs...`);
// Polling for results
let completed = false;
while (!completed) {
const statusResponse = await axios.get(
`${API_BASE}/v1/batch/${batchId}`,
{
headers: {
'Authorization': `Bearer ${API_KEY}`,
},
}
);
const status = statusResponse.data;
console.log(`Progress: ${status.completed}/${status.total} completed`);
if (status.completed === status.total) {
completed = true;
console.log('Batch processing completed!');
// Lấy results
const results = status.results;
results.forEach((result, index) => {
console.log(`\n[${index + 1}] ${result.url}`);
console.log(`Status: ${result.status}`);
if (result.markdown) {
console.log(`Content preview: ${result.markdown.substring(0, 100)}...`);
}
});
} else {
// Chờ 5 giây rồi check lại
await new Promise((resolve) => setTimeout(resolve, 5000));
}
}
} catch (error) {
console.error('Error in bulk processing:', error.message);
}
}
// Gọi function
const urls = [
'https://example.com/page1',
'https://example.com/page2',
'https://example.com/page3',
// ... 500+ URLs
];
bulkScrapeUrls(urls);So sánh AnyCrawl với các đối thủ
Để giúp bạn đưa ra quyết định phù hợp, bảng dưới đây so sánh AnyCrawl với Firecrawl (công cụ phổ biến cho AI) và Selenium (truyền thống).
| Tính Năng | AnyCrawl | Firecrawl | Crawl4AI | Selenium |
|---|---|---|---|---|
| Open Source | MIT | Proprietary | Apache | Apache |
| Tối ưu cho LLM | Native | Yes | Markdown | No |
| Hỗ trợ SERP | Google/Bing | Beta | No | No |
| Multi-threading | Native | Async | Async | Limited |
| JSON Schema | Yes | Yes | No | No |
| Tự Host | Yes | API only | Yes | Yes |
| Hiệu năng | Rất nhanh | Nhanh | Tốt | Chậm |
TIPS:
Khi xây dựng hệ thống RAG, đừng nhồi nhét toàn bộ Markdown vào Vector DB.
Hãy chia nhỏ (chunking) Markdown trả về từ AnyCrawl thành các đoạn khoảng 512-1024 tokens. Điều này giúp việc tìm kiếm ngữ nghĩa (semantic search) chính xác hơn và tránh vượt quá context window của LLM.
Ưu điểm và nhược điểm
Dù mạnh mẽ, AnyCrawl vẫn có những điểm cần cân nhắc trước khi sử dụng cho môi trường production.
Ưu điểm
- Mã nguồn mở (MIT): Hoàn toàn miễn phí, không bị phụ thuộc vào vendor (vendor lock-in).
- Dữ liệu sạch: Đầu ra Markdown/JSON giúp tiết kiệm thời gian clean data.
- SERP Built-in: Giải pháp duy nhất trong phân khúc OSS tích hợp sẵn tìm kiếm.
- Linh hoạt Engine: Cho phép chọn giữa Cheerio (nhanh, cho web tĩnh) hoặc Playwright/Puppeteer (cho web render bằng JS).
Nhược điểm
- Độ chín của dự án: Vẫn đang ở giai đoạn Beta (v0.x), có thể có thay đổi lớn về API.
- Tài liệu: Chưa phong phú bằng các công cụ lâu đời như Selenium.
- Vận hành: Việc tự host yêu cầu kiến thức về Docker, Redis và PostgreSQL.
Câu hỏi thường gặp
1. AnyCrawl có hỗ trợ vượt qua CAPTCHA không?
AnyCrawl hỗ trợ sử dụng proxy để giảm thiểu khả năng bị chặn. Tuy nhiên, với các hệ thống chống bot cao cấp (như Cloudflare Turnstile), bạn có thể cần cấu hình thêm plugin cho Playwright/Puppeteer bên trong AnyCrawl hoặc sử dụng các dịch vụ giải CAPTCHA bên thứ ba.
2. Tôi nên dùng engine cheerio hay playwright?
- Dùng Cheerio cho các trang web tĩnh (HTML trả về trực tiếp từ server) vì tốc độ rất nhanh và tốn ít tài nguyên.
- Dùng Playwright cho các trang Single Page Application (SPA) viết bằng React/Vue/Angular cần Javascript để hiển thị nội dung.
3. Làm sao để scale AnyCrawl?
AnyCrawl sử dụng Redis để quản lý hàng đợi (queue). Để scale, bạn có thể triển khai nhiều instance của AnyCrawl Worker kết nối vào cùng một Redis server. Hệ thống sẽ tự động phân tải công việc.








