Crawlee: thư viện web scraping cho Node.js
Crawlee đáng thiết lập khi một dự án scraping vượt quá một script đơn lẻ — nó gom Playwright, Puppeteer và Cheerio vào chung một interface, kèm sẵn hàng đợi request, retry và proxy rotation mà bạn vốn phải tự viết. Đây là lớp orchestration nằm trên các thư viện browser đó, không phải bản thay thế, nên bạn vẫn tự viết selector và logic riêng cho từng trang. Một trang tĩnh duy nhất thì không cần đến bộ máy này.
Crawlee là gì?
Crawlee là thư viện mã nguồn mở viết bằng Node.js và TypeScript cho web scraping và browser automation, do Apify phát triển. Crawlee cho bạn một interface crawler duy nhất trên Playwright, Puppeteer, Cheerio, JSDOM và raw HTTP request, cùng với hàng đợi request bền vững, proxy rotation tích hợp sẵn và storage có thể cắm thêm cho dữ liệu và file mà một lượt crawl thu về.
Các tính năng chính cho web scraping và automation
- ✓Một interface crawler dùng chung cho PlaywrightCrawler, PuppeteerCrawler, CheerioCrawler và JSDOM, nên chuyển giữa trình duyệt đầy đủ và HTTP thuần không bắt bạn viết lại code trích xuất dữ liệu.
- ✓Hàng đợi request bền vững, hỗ trợ cả crawl breadth-first lẫn depth-first, và sống sót qua một lần restart.
- ✓Proxy rotation và session management được tích hợp sẵn trong cấu hình crawler thay vì cần thêm một thư viện riêng.
- ✓Tự động scale số lượng request đồng thời theo tài nguyên hệ thống còn trống.
- ✓Tự sinh header giống trình duyệt thật và TLS fingerprint mà không cần cấu hình, kể cả ở chế độ HTTP thuần.
- ✓CLI (npx crawlee create) dựng sẵn một project chạy được ngay kèm boilerplate.
- ✓Storage có thể cắm thêm, dùng được cho cả dữ liệu dạng bảng (Dataset) lẫn file tải về.
- ✓Dockerfile có sẵn trong repo, sẵn sàng để deploy.
Bắt đầu với Crawlee
Crawlee cần Node.js bản 16 trở lên. Cách nhanh nhất là dùng Crawlee CLI: `npx crawlee create my-crawler`, rồi `cd my-crawler` và `npm start` — lệnh này tự cài dependency và tạo sẵn boilerplate cho bạn. Nếu muốn thêm Crawlee vào project đang có sẵn, chạy `npm install crawlee playwright` (Playwright không được đóng gói kèm, để giảm dung lượng cài đặt, nên bạn tự thêm khi cần dùng trình duyệt). Bản pre-release cũng có sẵn: `npm install crawlee@next`.
Viết crawler đầu tiên của bạn
Một crawler tối giản import PlaywrightCrawler và Dataset từ `crawlee`, định nghĩa một `requestHandler` chạy cho mỗi trang, rồi gọi `crawler.run()` với URL bắt đầu. Bên trong handler, bạn đọc trang (ví dụ `page.title()`), lưu kết quả bằng `Dataset.pushData()`, và gọi `enqueueLinks()` để thêm các link tìm thấy trên trang đó vào hàng đợi. Mặc định, mọi thứ được lưu vào `./storage` trong thư mục làm việc; vị trí lưu trữ này có thể cấu hình lại.
Điểm mạnh
- ✓Chuyển từ scraping HTTP sang browser automation đầy đủ chỉ là đổi một dòng (CheerioCrawler sang PlaywrightCrawler), vì cả hai dùng chung một dạng request handler.
- ✓Proxy rotation, session management và hàng đợi bền vững đều có sẵn — bạn không phải tự ráp từ nhiều package riêng lẻ.
- ✓CLI dựng xong một project chạy được chỉ với hai lệnh.
- ✓Viết bằng TypeScript với generics, nên type của request và page được kiểm tra chứ không chỉ được ghi trong docs.
- ✓Dockerfile đã có sẵn trong repo, nên deploy một crawler không phải bắt đầu từ một Dockerfile trống.
Khi nào Crawlee không phải lựa chọn phù hợp
- △Playwright không được đóng gói kèm — bạn phải cài riêng, và nó kéo theo browser binary thật, làm tăng dung lượng cài đặt cho một project chỉ thỉnh thoảng mới cần trình duyệt.
- △Node.js 16+ là yêu cầu bắt buộc, nên trên một runtime cũ hơn thì Crawlee không chạy được nếu chưa nâng cấp.
- △Storage mặc định là filesystem cục bộ (`./storage`); dùng trong môi trường serverless hoặc ephemeral thì bạn phải tự cấu hình một storage backend khác.
- △Phần lớn tài liệu thật — hướng dẫn, chi tiết cấu hình, ví dụ — nằm ở trang crawlee.dev riêng, không nằm trong README của repo.
Crawlee so với các lựa chọn scraping khác
Câu hỏi thường gặp
Crawlee hỗ trợ cả Playwright lẫn Puppeteer qua PlaywrightCrawler và PuppeteerCrawler, hai class này dùng chung một interface request handler. Nghĩa là bạn có thể chọn thư viện browser automation nào mình quen dùng, hoặc đổi qua lại giữa hai thư viện, mà không phải viết lại cách trang được scrape.
Crawlee xử lý cả hai ngay từ đầu — proxy rotation và session management được tích hợp sẵn trong cấu hình crawler thay vì cần một thư viện riêng, nên request được rải qua các proxy và session tự động trong lúc crawl chạy.
Crawlee yêu cầu Node.js bản 16 trở lên. Điều này được ghi rõ trong hướng dẫn cài đặt, và áp dụng dù bạn dựng project bằng Crawlee CLI hay tự thêm Crawlee qua npm install.
Crawlee lưu dữ liệu scrape được qua Dataset API — gọi Dataset.pushData() bên trong request handler sẽ lưu kết quả dưới dạng JSON. Mặc định, dữ liệu đó nằm ở ./storage/datasets/default trong thư mục làm việc, dù vị trí lưu trữ này có thể cấu hình lại.
Crawlee được cấp phép theo Apache-2.0, một giấy phép mã nguồn mở dạng permissive cho phép dùng cho mục đích thương mại, chỉnh sửa và phân phối lại mà không phải trả phí cho bản thân thư viện.
Crawlee đi kèm sẵn Dockerfile trong repo, nên đóng gói một crawler vào container không phải bắt đầu từ số 0. Crawlee cũng chạy được trên nền tảng Apify, do cùng đội ngũ xây dựng, cung cấp khả năng deploy lên cloud cho project Crawlee.
Vấn đề mà Crawlee giải quyết
Scrape một website thật đòi hỏi xử lý cùng lúc nhiều thứ riêng biệt — một hàng đợi sống sót qua restart, proxy rotation để request không bị chặn, fingerprint trình duyệt không lộ là tự động hóa, và cách chuyển giữa HTTP thuần với một trình duyệt headless đầy đủ tùy theo từng trang. Crawlee gom tất cả vào một thư viện duy nhất, thay vì để mỗi project tự ráp lại từ các package rời rạc.
Những trường hợp sử dụng phù hợp nhất
- •Scrape các trang render bằng JavaScript (danh sách sản phẩm, giá, nội dung động) bằng PlaywrightCrawler hoặc PuppeteerCrawler.
- •Crawl nhanh, quy mô lớn các trang tĩnh hoặc trả JSON bằng CheerioCrawler, bỏ qua chi phí chạy một trình duyệt thật.
- •Xây dataset cho pipeline AI, LLM hoặc RAG — README của Crawlee liệt kê thẳng đây là một use case.
- •Tải các file như PDF, JPG, PNG phát hiện được trong quá trình crawl, không chỉ HTML.
- •Các lượt crawl cần vượt qua cơ chế chặn bot cơ bản nhờ proxy xoay vòng và fingerprint giống trình duyệt thật.
Ai nên thử — và ai nên bỏ qua
Nên thử Crawlee nếu bạn đã viết code scraping bằng Node.js hoặc TypeScript và cứ phải giải lại cùng một vấn đề — hàng đợi request, retry, proxy rotation, chuyển qua lại giữa HTTP và trình duyệt thật tùy trang. Bỏ qua nếu stack của bạn là Python (scrapy hoặc Scrapling giải quyết đúng phần việc đó ở phía Python), hoặc nếu toàn bộ việc cần làm chỉ là một script chạy trên một trang tĩnh — kéo cả một crawler framework vào lúc đó tốn công thiết lập hơn cả việc cần làm.
Repo liên quan
Chưa chắc crawlee có hợp với bạn?
Để ChatGPT, Claude hoặc Perplexity tìm hiểu giúp — bấm bên dưới và xem AI nói gì về crawlee.
