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.
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í | Scrapy | Playwright |
|---|---|---|
| Bản chất | Framework cào dữ liệu bất đồng bộ cho Python | Thư viện điều khiển trình duyệt Chromium, Firefox, WebKit |
| Chạy JavaScript | Không | Có, như trình duyệt thật |
| Tốc độ, tài nguyên | Rất nhanh, nhẹ, một máy chạy được nhiều request đồng thời | Chậ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ện | Không có; chỉ gửi request HTTP | Bấm, gõ, cuộn, chờ phần tử xuất hiện |
| Có sẵn | Hàng đợi, retry, giới hạn tốc độ, pipeline xuất dữ liệu | Chụ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ới | Danh mục sản phẩm, tin tức, trang HTML, API JSON | Trang 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
localevàtimezone_idcủ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á