Đến nội dung chính
Phạm Nam

Tìm kiếm

Nhập từ khoá để tìm trong các bài viết.

Quay lại
vi

Scrapling: Web Scraping Python từ một request tới crawl lớn

Scrapling gom fetch, parser, spider vào một framework Python: cài đặt, chọn nhánh fetch, chạy CLI extract và vận hành job crawl đúng robots.txt và ToS.

10 phút đọc—

Ảnh minh họa: Scrapling: Web Scraping Python từ một request tới crawl lớn

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ứngCách xử lý
ModuleNotFoundErrorCài pip install "scrapling[fetchers]"
Thiếu trình duyệtChạy scrapling install hoặc --force
Trang JS thiếu nội dungDùng StealthyFetcher, fetch + --wait-selector
Session rớt khi xoay proxyTách chiến lược theo domain
Bị chặn/khóa IPGiả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íScraplingScrapyPlaywrightrequests + BeautifulSoup
Phạm viFetch, parse, crawl, exportFramework crawl trưởng thànhRender trình duyệtTrang tĩnh, parse đơn giản
Render JSCó, StealthyFetcherKhôngMạnh nhấtKhông
Chống bot, TLSCó, đóng gói sẵnKhôngTự cấu hìnhKhông
Session, proxy, retryCó sẵnCó, qua middlewareTự viếtTự viết
Crawl, pause/resumeCó, tích hợp sẵnMạnh, quy mô lớn hơnTự viếtKhông
Trích xuất, exportCSS, XPath, text, regexSelector, pipelineTự viếtCSS, tự viết
Tích hợp AI agentMCP, Agent SkillKhôngKhôngKhông
Độ nặng, trưởng thànhNặng khi cần browser; trẻ, v0.5Trung bình; trưởng thànhNặng; trưởng thànhNhẹ 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

Bài học rút ra

  1. Chọn nhánh fetch theo nhu cầu render: trang tĩnh dùng Fetcher HTTP, trang JS mới dùng StealthyFetcher.
  2. Cài đúng extra ngay từ đầu: base install chỉ có parser, và lỗi ModuleNotFoundError là tín hiệu thiếu extra, không phải lỗi code.
  3. 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 đó.
  4. 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.
  5. 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ài viết liên quan

  • 10 phút đọc—

    Lightpanda: trình duyệt headless nhẹ cho AI agent

    Lightpanda là trình duyệt headless viết bằng Zig, bỏ tầng render để chạy nhẹ cho AI agent. Hướng dẫn cài binary, Docker và nối Puppeteer/Playwright qua CDP.

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