
Sáng thứ Hai, job crawl báo thành công nhưng bảng dữ liệu trống một nửa. Trang cần lấy đã chuyển sang render bằng JavaScript: mở bằng trình duyệt thì thấy đủ nội dung, còn HTML mà script fetch về chỉ là khung rỗng. Scrapling đặt cược vào đúng chỗ này: một thư viện Python bao trọn fetch, parse, crawl và export.
Vì sao crawl dữ liệu website bằng Python cứ hỏng dần theo từng nấc?
Nấc 1: trang tĩnh thì được, trang JS thì mất nội dung. HTML ban đầu chỉ là khung, dữ liệu thật nằm sau các request API nền hoặc sau thao tác chờ phần tử xuất hiện.
Nấc 2: request bị chặn, session rớt, IP bị khóa khi chạy định kỳ. Job chạy một lần bằng tay thường qua được, job chạy mỗi giờ thì không, vì website nhận ra mẫu truy cập lặp lại.
Nấc 3: có dữ liệu rồi nhưng thiếu parser, crawler, export và lịch chạy ổn định. Vẫn còn việc dang dở: trích đúng trường khi website đổi class HTML, đi theo các trang con mà không lặp vô hạn, tạm dừng và chạy tiếp khi job bị ngắt, xuất CSV, JSON hay Markdown mà hệ thống phía sau đọc được.
Scrapling là gì và giải quyết bài toán nào?
Scrapling là framework web scraping viết bằng Python, giấy phép BSD-3-Clause, ra mắt ngày 2024-10-13. Tại thời điểm kiểm tra 2026-11-03, dự án có 93.510 stars và 9.829 forks trên GitHub, lần cập nhật gần nhất là 2026-11-02, bản mới nhất lúc đó là v0.5 ngày 17/10/2026.
Bốn tầng của Scrapling gồm: fetch lấy trang, parser trích dữ liệu, spider crawl đồng thời, và các cổng ra như CLI hay MCP server cho AI agent. Parser tách khỏi fetcher, nên cùng một cách chọn phần tử có thể dùng lại cho cả trang lấy bằng HTTP thuần lẫn trang lấy bằng trình duyệt thật.
Scrapling hợp với developer, data engineer cần thu thập dữ liệu web có cấu trúc theo lịch; sysadmin và DevOps chạy job định kỳ, cần session, retry và proxy rotation; người dùng homelab muốn một job nhỏ xuất Markdown; và người dùng AI agent cần dữ liệu sạch cho RAG. Theo mình, bạn không cần Scrapling nếu chỉ cần lấy một trang tĩnh đơn giản, nếu cần crawl phân tán ở quy mô lớn, hoặc nếu mục đích là vượt cơ chế kiểm soát truy cập của website.
Kiến trúc Scrapling: Fetcher, StealthyFetcher, Parser và Spider vận hành ra sao?
flowchart LR
Site[Website mục tiêu] --> Choice{Trang cần JS?}
Choice -- Không --> Fetcher[Fetcher: HTTP + TLS fingerprint impersonation + HTTP/3]
Choice -- Có --> Stealth[StealthyFetcher: Playwright Chromium/Chrome]
Fetcher --> Session[FetcherSession / StealthySession: session, cookie, retry]
Stealth --> Session
Proxy[ProxyRotator: xoay proxy, override theo request] -.-> Session
Session --> Parser[Parser: CSS / XPath / text / regex + adaptive element tracking]
Parser --> Spider[Spider: crawl đồng thời, pause/resume]
Spider --> Export[Xuất Markdown / CSV / JSON]
Export --> Consumer[Script, job theo lịch, hoặc AI agent qua MCP]
Session -. Chặn domain/quảng cáo, bắt API nền .-> Parser
Ba quyết định hiện ra từ sơ đồ. Điểm rẽ nằm ở nhu cầu JavaScript. Session, proxy và retry bao quanh cả hai nhánh fetch. Parser đứng giữa, tách khỏi cách lấy trang.
Fetcher và StealthyFetcher khác nhau về bản chất. Fetcher là nhánh HTTP, hợp với trang tĩnh và API nền. StealthyFetcher là nhánh trình duyệt thật qua Playwright, dùng Chromium hoặc Chrome, hợp với trang JS-rendered.
FetcherSession và StealthySession giữ session và cookie giữa các request. ProxyRotator xoay proxy hoặc dùng danh sách tùy chỉnh. Theo mình, đừng bật cả hai một cách mặc định: session cần tính liên tục, rotation cố tình phá tính liên tục đó.
Parser và Spider: parser trích xuất bằng CSS selector, XPath, text và regex. Spider crawl đồng thời, tạm dừng và chạy tiếp, kèm export tích hợp sẵn. CLI và MCP là hai cổng ra phụ.
Giới hạn cần nói thẳng: Scrapling yêu cầu Python 3.10 trở lên, bản cơ bản chỉ có parser. Nhánh browser kéo theo Playwright và system dependency, nặng hơn hẳn nhánh HTTP thuần. Dự án còn trẻ, bản v0.5, nên API có thể thay đổi.
Hướng dẫn triển khai Scrapling: cài đặt, xác minh và lỗi thường gặp
Chuẩn bị Python 3.10+ và một môi trường ảo riêng cho job crawl. Chọn extra theo nhu cầu: scrapling chỉ có parser, scrapling[fetchers] cho fetch và spider, scrapling[ai] cho MCP server, scrapling[rag] cho hệ thống RAG, scrapling[shell] cho shell và lệnh extract, scrapling[all] cho tất cả. Container: image pyd4vinci/scrapling và ghcr.io/d4vinci/scrapling:latest, nên ghim tag cho production.
python -m venv .venv
source .venv/bin/activate
pip install scrapling
Lệnh này chỉ cài parser. Nếu sau đó bạn import scrapling.fetchers hoặc scrapling.spiders mà chưa cài extra tương ứng, Python sẽ báo ModuleNotFoundError. Đó là tín hiệu bạn đang thiếu tầng cần dùng. Để có tầng fetch và spider:
pip install "scrapling[fetchers]"
scrapling install
Lệnh scrapling install tải trình duyệt và system dependency. Chỉ fetch HTTP thuần thì không cần bước này, nhưng với StealthyFetcher, thiếu nó là thiếu trình duyệt thật để chạy. Khi cần cài lại sạch, dùng scrapling install --force. Nếu dùng CLI và shell, cài thêm pip install "scrapling[shell]".
python --version
pip show scrapling
python -c "import scrapling.fetchers"
python -c "import scrapling.spiders"
scrapling --help
Tiếp theo, chạy thử CLI extract trên trang mẫu:
scrapling extract get 'https://quotes.toscrape.com/' quotes.md
Output kỳ vọng là file quotes.md chứa nội dung đã trích xuất, không phải HTML thô. Bạn có thể giới hạn vùng lấy bằng --css-selector và giả mạo fingerprint trình duyệt bằng --impersonate 'chrome'. Với trang cần JavaScript, dùng biến thể fetch kèm --wait-selector. Định dạng đầu ra đi theo đuôi file: .txt, .md, .html. Nếu trang JS mà bạn dùng lệnh get thay vì fetch kèm --wait-selector, nội dung trả về có thể thiếu. Đó là dấu hiệu bạn chọn sai nhánh fetch, không phải tool hỏng.
| Triệu chứng | Cách xử lý |
|---|---|
ModuleNotFoundError | Cài pip install "scrapling[fetchers]" |
| Thiếu trình duyệt | Chạy scrapling install hoặc --force |
| Trang JS thiếu nội dung | Dùng StealthyFetcher, fetch + --wait-selector |
| Session rớt khi xoay proxy | Tách chiến lược theo domain |
| Bị chặn/khóa IP | Giảm tần suất, kiểm tra robots.txt và ToS |
Đánh giá kỹ thuật Scrapling: ưu điểm, nhược điểm và bảo mật
Ưu điểm: bạn không phải tự nối requests với Playwright, Playwright với parser, parser với hàng đợi crawl và export. Session, retry, proxy rotation, parser, spider và export nằm chung một mô hình.
Nhược điểm: bạn nhận một bề mặt lỗi rộng hơn, khi transport, browser, parser và spider gộp trong một dự án còn trẻ. Nhánh StealthyFetcher tốn tài nguyên trình duyệt thật, nên chạy nó cho mọi trang là cách đốt CPU và RAM nhanh nhất mà không tăng tỷ lệ thành công tương ứng.
Bảo mật và tuân thủ: tài liệu của dự án nêu rõ thư viện chỉ dùng cho mục đích giáo dục và nghiên cứu, người dùng phải tuân thủ luật về thu thập dữ liệu và quyền riêng tư, tôn trọng điều khoản sử dụng và robots.txt của website. Tài liệu của dự án cũng ghi rằng StealthyFetcher có thể dễ dàng vượt mọi dạng Cloudflare Turnstile và Interstitial. Đây là claim của dự án, phần này mình chưa kiểm chứng độc lập, và bài viết không dùng nó làm hướng dẫn vượt kiểm soát truy cập.
Ranh giới thực hành, theo mình, nên đặt như sau: chỉ crawl website của chính bạn, dữ liệu công khai mà bạn có quyền thu thập, hoặc giám sát giá và nội dung khi được phép theo hợp đồng. Khi website cung cấp API chính thức, ưu tiên API đó trước. Không gửi credential, token hay dữ liệu nhạy cảm qua job crawl. Nội dung web crawl về là dữ liệu không tin cậy: đưa thẳng vào agent hoặc RAG mà không lọc có nguy cơ prompt injection.
Hiệu năng, vận hành và rollback: Fetcher HTTP nhẹ và nhanh hơn StealthyFetcher dùng trình duyệt thật. Crawl đồng thời tăng throughput nhưng cũng tăng nguy cơ bị chặn. Pause và resume giúp job dài hơi chạy tiếp sau khi bị ngắt, nhưng nó không thay thế dedup. Log cần ghi số request thành công và thất bại, số trang thiếu nội dung JS, và tỷ lệ bị chặn. Rollback cần chuẩn bị trước: ghim phiên bản extra đã cài, giữ lại bản cũ. Nếu bản mới kém hiệu quả hơn, quay về bản cũ thay vì tăng proxy hay concurrency để bù.
So sánh Scrapling với Scrapy, Playwright và BeautifulSoup trên cùng tiêu chí
Đừng nhầm Scrapling với Scrapy, dù tên gần nhau: đây là hai dự án khác nhau, ở hai mức độ trưởng thành khác nhau.
| Tiêu chí | Scrapling | Scrapy | Playwright | requests + BeautifulSoup |
|---|---|---|---|---|
| Phạm vi | Fetch, parse, crawl, export | Framework crawl trưởng thành | Render trình duyệt | Trang tĩnh, parse đơn giản |
| Render JS | Có, StealthyFetcher | Không | Mạnh nhất | Không |
| Chống bot, TLS | Có, đóng gói sẵn | Không | Tự cấu hình | Không |
| Session, proxy, retry | Có sẵn | Có, qua middleware | Tự viết | Tự viết |
| Crawl, pause/resume | Có, tích hợp sẵn | Mạnh, quy mô lớn hơn | Tự viết | Không |
| Trích xuất, export | CSS, XPath, text, regex | Selector, pipeline | Tự viết | CSS, tự viết |
| Tích hợp AI agent | MCP, Agent Skill | Không | Không | Không |
| Độ nặng, trưởng thành | Nặng khi cần browser; trẻ, v0.5 | Trung bình; trưởng thành | Nặng; trưởng thành | Nhẹ nhất; trưởng thành |
Theo mình, Scrapling thắng ở mức độ đóng gói toàn chuỗi cho quy mô vừa, thua Scrapy ở độ trưởng thành và khả năng crawl quy mô lớn, thua Playwright thuần ở kiểm soát trình duyệt thô. Không có con số benchmark nào trong bảng này, vì phần này mình chưa đo độc lập.
Use case thực tế
Doanh nghiệp: giám sát giá và nội dung khi được phép, theo lịch. Đầu vào là danh sách URL mà doanh nghiệp có quyền theo dõi theo hợp đồng. Dùng spider với session ổn định, chạy theo lịch, xuất CSV hoặc JSON cho hệ thống giá. Giới hạn: nếu điều khoản không cho phép thu thập tự động, hoặc website đã có API, thì không dùng spider để lách.
Homelab: job crawl nhỏ chạy trong container, xuất Markdown để tra cứu. Đầu vào là vài chục trang tài liệu hoặc blog kỹ thuật. Dùng CLI extract hoặc spider nhỏ trong container, xuất Markdown để tra cứu offline. Nhánh HTTP thường đủ, chỉ chuyển sang StealthyFetcher cho những trang thực sự cần JS.
AI workflow: lấy Markdown sạch qua CLI hoặc MCP cho RAG, kèm bước lọc. Đầu vào là trang tài liệu công khai. Dùng CLI extract ra Markdown, hoặc MCP server để agent lấy dữ liệu có cấu trúc, rồi qua một bước lọc trước khi đưa vào RAG. Liên quan tới hướng này, bạn có thể đối chiếu với cách Xerj tổ chức dữ liệu local cho AI agent.
DevOps và IT admin: kiểm tra website của chính mình. Đây là use case sạch nhất về tuân thủ. Dùng Fetcher cho các trang tĩnh, StealthyFetcher khi cần kiểm tra trang JS-rendered sau mỗi lần deploy. Bạn có thể tham khảo thêm Lightpanda: Lightpanda là một headless browser, còn Scrapling là framework scraping dùng trình duyệt qua Playwright khi cần.
Kết luận: ai hợp với Scrapling, ai không, và bước tiếp theo
Scrapling hợp với team cần một framework bao phủ fetch, parse, crawl và export, chấp nhận đổi tài nguyên browser lấy khả năng render JS, và làm việc trong ranh giới robots.txt và điều khoản sử dụng. Nó không hợp với người chỉ cần parse trang tĩnh, team cần crawl phân tán quy mô lớn, hay người tìm công cụ để vượt kiểm soát truy cập.
Bước tiếp theo, theo mình, nên đi từ nhỏ tới lớn: bắt đầu từ CLI extract trên một trang mẫu như quotes.toscrape.com, kiểm tra xem nội dung lấy được có đủ không, rồi mới chuyển sang spider kèm session và proxy khi job bắt đầu chạy định kỳ.
Tài liệu tham khảo
- Repo chính thức: https://github.com/D4Vinci/Scrapling
- Tài liệu chính thức: https://scrapling.readthedocs.io
- Bảng xếp hạng trending: https://trendshift.io
Bài học rút ra
- Chọn nhánh fetch theo nhu cầu render: trang tĩnh dùng Fetcher HTTP, trang JS mới dùng StealthyFetcher.
- Cài đúng extra ngay từ đầu: base install chỉ có parser, và lỗi
ModuleNotFoundErrorlà tín hiệu thiếu extra, không phải lỗi code. - Session và proxy rotation phải thiết kế cùng nhau, không bật cả hai một cách mặc định: session cần tính liên tục, rotation cố tình phá tính liên tục đó.
- Claim chống bot của vendor không thay thế việc tôn trọng robots.txt, điều khoản sử dụng và API chính thức: claim đó chưa được kiểm chứng trong bài này.
- Job crawl cần giám sát theo tỷ lệ thiếu nội dung và bị chặn, và cần đường rollback bằng phiên bản đã ghim.
Phạm vi xác minh
Ngày kiểm tra: 2026-11-03 (ICT). Đã xác minh với README và tài liệu chính thức: yêu cầu Python 3.10+, các extra và lệnh cài đặt, CLI extract, Docker images, danh sách class và tính năng, giấy phép BSD-3-Clause, bản v0.5 ngày 17/10/2026, số stars và forks qua GitHub API. Parser là mặc định của base install; fetchers và spiders, shell và extract, MCP và RAG đều là extra opt-in, không đi kèm base. Các con số là cấu hình và thông tin dự án, không phải benchmark độc lập. Chưa kiểm chứng trong quá trình chuẩn bị bài này: không cài đặt, không chạy crawl, không đo benchmark, không test khả năng vượt Cloudflare.
Bình luận
Bình luận được duyệt trước khi hiển thị.Đang tải bình luận…
Để lại bình luận