Scrapy hay Playwright: chọn đúng công cụ cho từng kiểu trang

Cập nhật:

Nếu dữ liệu bạn cần có sẵn trong HTML trả về từ máy chủ, hãy chọn Scrapy: nhanh, nhẹ, chạy hàng nghìn trang với rất ít tài nguyên. Nếu dữ liệu chỉ hiện ra sau khi JavaScript chạy, cần cuộn trang, bấm nút hoặc đăng nhập qua giao diện, hãy chọn Playwright vì nó điều khiển một trình duyệt thật. Nhiều dự án dùng cả hai: Scrapy cho phần lớn trang, Playwright cho số ít trang khó. Bài này giúp bạn kiểm tra trang đích thuộc loại nào, so sánh hai công cụ theo tiêu chí thực tế và cấu hình proxy cho từng bên.

Proxy riêng cho Scrapy và Playwright

Kiểm tra trang đích trước khi chọn công cụ

Sai lầm phổ biến là mặc định dùng trình duyệt cho mọi thứ vì nó luôn "thấy" được trang, rồi trả giá bằng tốc độ chậm và máy chủ tốn tài nguyên. Hãy dành vài phút kiểm tra trang đích trước.

Cách nhanh nhất là tải trang bằng curl hoặc xem nguồn trang (Ctrl+U) và tìm dữ liệu bạn cần, ví dụ tên sản phẩm hay giá. Nếu nó có trong HTML, trang là dạng tĩnh hoặc render phía máy chủ, Scrapy làm được. Nếu HTML gần như trống và dữ liệu chỉ hiện trong trình duyệt, mở tab Network của DevTools, lọc Fetch/XHR và xem trang gọi API nào. Rất nhiều trang hiện đại lấy dữ liệu từ một endpoint JSON; nếu endpoint đó công khai và bạn được phép dùng, gọi thẳng nó bằng Scrapy còn nhanh hơn render cả trang.

So sánh Scrapy và Playwright

Tiêu chíScrapyPlaywright
Bản chấtFramework cào dữ liệu bất đồng bộ cho PythonThư viện điều khiển trình duyệt Chromium, Firefox, WebKit
Chạy JavaScriptKhôngCó, như trình duyệt thật
Tốc độ, tài nguyênRất nhanh, nhẹ, một máy chạy được nhiều request đồng thờiChậm hơn, mỗi trang tốn CPU và RAM của một tab trình duyệt
Tương tác giao diệnKhông có; chỉ gửi request HTTPBấm, gõ, cuộn, chờ phần tử xuất hiện
Có sẵnHàng đợi, retry, giới hạn tốc độ, pipeline xuất dữ liệuChụp màn hình, ghi lại thao tác, chờ mạng, nhiều ngôn ngữ lập trình
Hợp vớiDanh mục sản phẩm, tin tức, trang HTML, API JSONTrang SPA, nội dung tải khi cuộn, luồng cần đăng nhập qua giao diện

Khi nào Scrapy là lựa chọn đúng

Scrapy mạnh ở khối lượng. Bạn khai báo spider, Scrapy lo hàng đợi URL, chạy đồng thời, thử lại khi lỗi, loại URL trùng và xuất dữ liệu ra JSON hay CSV. Các thiết lập như CONCURRENT_REQUESTS_PER_DOMAIN, DOWNLOAD_DELAY và AutoThrottle giúp bạn giữ nhịp lịch sự với website đích mà không phải tự viết logic.

Chọn Scrapy khi dữ liệu nằm trong HTML hoặc trong một API JSON công khai, khi bạn cần cào hàng nghìn trang trở lên, và khi máy chạy có tài nguyên hạn chế. Nếu chỉ cần vài chục trang, thư viện requests kèm BeautifulSoup có khi còn đơn giản hơn.

Khi nào cần Playwright

Playwright cần thiết khi nội dung được dựng bằng JavaScript sau khi trang tải, khi dữ liệu chỉ hiện ra lúc cuộn hoặc bấm nút, hoặc khi bạn cần thao tác giống người dùng như chọn bộ lọc. Nó cũng hữu ích để kiểm tra trang hiển thị thế nào ở một quốc gia, ví dụ chụp màn hình trang qua proxy của nước đó.

Cái giá là tài nguyên. Mỗi context trình duyệt tốn bộ nhớ đáng kể, nên đừng mở hàng trăm tab cùng lúc. Chặn tải ảnh, font và video bằng page.route khi bạn chỉ cần dữ liệu, và đóng context ngay khi xong việc. Trình duyệt tự động hoá cũng có những dấu hiệu website có thể nhận ra; bài vì sao headless browser bị phát hiện giải thích các dấu hiệu đó.

Cấu hình proxy cho Scrapy

  • Gắn proxy cho từng request: yield scrapy.Request(url, meta={'proxy': 'http://user:pass@ip:port'}). Middleware proxy có sẵn của Scrapy tự tách user, mật khẩu và gửi header xác thực.
  • Nếu mật khẩu có ký tự đặc biệt, mã hoá URL trước khi ghép chuỗi để tránh lỗi 407.
  • Muốn xoay IP, viết một downloader middleware nhỏ gán request.meta['proxy'] từ danh sách của bạn, hoặc gán theo tài khoản nếu cần giữ phiên.
  • Chi tiết từng bước có tại hướng dẫn cài proxy cho Scrapy.

Cấu hình proxy cho Playwright

  • Cho cả trình duyệt: browser = p.chromium.launch(proxy={'server': 'http://ip:port', 'username': 'user', 'password': 'pass'}).
  • Cho từng context, mỗi context một IP: context = browser.new_context(proxy={'server': 'http://ip:port', 'username': 'user', 'password': 'pass'}). Cách này hợp khi chạy nhiều phiên song song trong một tiến trình.
  • Khớp locale và timezone_id của context với quốc gia của proxy để trang hiển thị đúng ngôn ngữ, giờ địa phương.
  • Kiểm tra IP thật sự đang dùng bằng cách mở một trang trả về IP trong chính context đó trước khi chạy job.
  • Xem thêm hướng dẫn cài proxy cho Playwright; với Node.js có hướng dẫn cho Puppeteer theo cách tương tự.

Kết hợp cả hai và chọn proxy

Gói scrapy-playwright cho phép một spider Scrapy gửi đa số request bằng HTTP thường và chỉ chuyển những trang cần JavaScript sang trình duyệt. Bạn giữ được hàng đợi, retry và pipeline của Scrapy, đồng thời chỉ tốn tài nguyên trình duyệt ở nơi thật sự cần.

Với cả hai công cụ, proxy IPv4 datacenter riêng thường đủ cho cào dữ liệu công khai: nhanh, không giới hạn băng thông và chỉ mình bạn dùng. Chọn quốc gia theo nội dung cần xem; có IPv4 ở 7 nước như Việt Nam, Mỹ hay Nhật Bản. Dù dùng công cụ nào, hãy tôn trọng robots.txt, điều khoản website và giữ nhịp hợp lý như trong bài giới hạn tốc độ khi cào dữ liệu.

Câu hỏi thường gặp

Scrapy có cào được trang dùng React hay Vue không?

Chỉ khi trang render phía máy chủ hoặc dữ liệu có trong một API JSON mà bạn gọi trực tiếp được. Nếu dữ liệu chỉ có sau khi JavaScript chạy trong trình duyệt, cần Playwright hoặc scrapy-playwright.

Playwright có chậm hơn Scrapy nhiều không?

Thường là có, vì mỗi trang phải tải và chạy như trong trình duyệt thật. Với cùng một máy, Scrapy xử lý được nhiều trang đồng thời hơn hẳn.

Mỗi context Playwright nên dùng một proxy riêng không?

Nên, nếu mỗi context đại diện cho một phiên hoặc một tài khoản. Như vậy cookie và IP luôn đi cùng nhau, tránh một phiên nhảy giữa nhiều IP.

Proxy có hỗ trợ SOCKS5 cho Playwright không?

Proxy của VinaProxy dùng HTTP/HTTPS với xác thực user và mật khẩu. Playwright hỗ trợ đầy đủ kiểu proxy này qua tham số server, username, password.

Selenium thì sao?

Selenium cũng điều khiển trình duyệt thật và cài proxy được; Playwright thường gọn hơn ở phần chờ phần tử và proxy có xác thực. Xem hướng dẫn Selenium nếu dự án của bạn đã dùng nó.

Proxy riêng cho Scrapy và Playwright

IPv4 datacenter riêng ở 7 nước, HTTP/HTTPS, xác thực user và mật khẩu, không giới hạn băng thông, kích hoạt tự động sau khi thanh toán.

Xem bảng giá

Bài viết liên quan

Cài đặt proxy
Cách cấu hình và xoay vòng bể proxy trong Python Scrapy
Hướng dẫn gắn danh sách proxy HTTP(S) vào Python Scrapy bằng HttpProxyMiddleware, request.meta['proxy'] và giới hạn CONCURRENT_REQUESTS_PER_IP.
Cài đặt proxy
Cách cấu hình proxy trong Playwright (Node.js & Python)
Hướng dẫn gắn proxy HTTP có username và password vào Playwright ở tầng Browser và BrowserContext. Cách chạy nhiều IP song song trên 1 tiến trình.
Kiến thức proxy
Headless browser bị phát hiện: website nhìn thấy gì và cấu hình sao cho hợp lý
Vì sao headless browser bị website phát hiện: navigator.webdriver, User-Agent, viewport, WebGL, múi giờ lệch IP, hành vi. Cấu hình Playwright, Puppeteer hợp lý.
Ứng dụng
Proxy cho web scraping và thu thập dữ liệu
Chọn proxy cào dữ liệu web: IPv4 riêng datacenter cho tốc độ, Static ISP cho web khó tính, không giới hạn băng thông, cùng cách thu thập dữ liệu đúng mực.
Sản phẩm
Proxy tĩnh (IP tĩnh dân cư ISP) Việt Nam & Mỹ
Mua proxy tĩnh ISP dân cư tại Mỹ và Việt Nam: IP đăng ký nhà mạng dân dụng, mỗi IP chỉ một khách dùng, băng thông không giới hạn. Xem giá và mua ngay.
Sản phẩm
Proxy IPv4 datacenter riêng
Mua, thuê proxy IPv4 datacenter riêng tại Mỹ, Việt Nam, Nhật Bản, Hàn Quốc, Singapore, Anh, Hồng Kông. HTTP(S), băng thông không giới hạn, kích hoạt tự động.
ISP · vietnam
Proxy ISP tĩnh Việt Nam: IP mạng gia đình cho các tài khoản giá trị nhất của bạn
Proxy dân cư tĩnh Việt Nam (ISP tĩnh): proxy IP tĩnh từ nhà mạng dân cư cho shop Shopee chính, TikTok Shop, tài khoản quảng cáo Facebook và Zalo OA.
IPV4 · united states
Proxy IPv4 riêng Mỹ: IP datacenter Hoa Kỳ nhanh, dùng riêng và ổn định
Thuê proxy IPv4 Mỹ dùng riêng cho cào dữ liệu, theo dõi thứ hạng, duyệt quảng cáo và nghiên cứu Amazon. IP tĩnh, 1 người 1 IP, băng thông không giới hạn.