Bối cảnh & Tại sao cần Playwright?
Đã bao giờ bạn hăm hở dùng BeautifulSoup hay Requests để lấy data, nhưng rồi nhận về một file HTML trắng bóc hoặc toàn thẻ <script> chưa? Đó là nỗi đau chung khi đụng độ các website hiện đại như Shopee, Facebook hay biểu đồ chứng khoán. Những trang này dùng cơ chế Single Page Application (SPA), dữ liệu chỉ được đổ ra sau khi JavaScript chạy xong.
Lúc này, các thư viện parse HTML tĩnh hoàn toàn “bó tay”. Trước đây, mình thường dùng Selenium. Tuy nhiên, Selenium khá nặng nề và thường xuyên gây lỗi phiên bản driver trên Linux. Một dự án automation của mình từng phình từ 200 dòng lên 2000 dòng code Selenium, khiến việc quản lý driver trở thành mê hồn trận. Khi chuyển sang Playwright, tốc độ thực thi tăng lên rõ rệt, đặc biệt là khả năng xử lý bất đồng bộ (async) cực mượt.
Playwright không chỉ nhanh mà còn sở hữu vũ khí bí mật: Auto-wait. Nó tự động đợi phần tử xuất hiện mới thao tác, giúp script của bạn ổn định hơn nhiều so với việc dùng time.sleep() vô tội vạ.
Cài đặt trong 1 nốt nhạc
Quên việc đi tìm tải Chromedriver cho khớp version trình duyệt đi. Playwright tự lo hết cho bạn. Đầu tiên, cài đặt thư viện:
pip install playwright
Sau đó, chạy lệnh để tải các nhân trình duyệt (Chromium, Firefox, WebKit):
playwright install chromium
Kinh nghiệm của mình: Nếu chỉ cào web phổ thông, bạn chỉ cần install chromium là đủ, giúp tiết kiệm khoảng 300MB dung lượng ổ cứng.
Cấu hình thực chiến
Đừng chỉ goto rồi lấy data ngay, bạn sẽ nhận về một mảng rỗng đấy. Với các site nặng JavaScript, cấu hình là yếu tố sống còn.
1. Tận dụng Async API để tăng tốc
Nếu bạn cần cào 100 trang cùng lúc, đừng dùng Sync. Hãy dùng asyncio. Trong một dự án thực tế, mình đã giảm thời gian cào 500 sản phẩm từ 15 phút xuống còn chưa đầy 3 phút nhờ chuyển sang Async.
import asyncio
from playwright.async_api import async_playwright
async def run():
async with async_playwright() as p:
# Dùng headless=True khi chạy trên server để tiết kiệm RAM
browser = await p.chromium.launch(headless=True)
context = await browser.new_context(
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36..."
)
page = await context.new_page()
await page.goto("https://tiki.vn/search?q=laptop")
# Tự động đợi đến khi danh sách sản phẩm hiển thị
await page.wait_for_selector(".product-item")
titles = await page.locator(".product-name").all_text_contents()
print(f"Tìm thấy {len(titles)} sản phẩm!")
await browser.close()
asyncio.run(run())
2. Xử lý cuộn trang (Infinite Scroll)
Các site như Facebook hay TikTok chỉ load thêm data khi bạn cuộn xuống. Thay vì đợi 5 giây, hãy dùng đoạn script giả lập hành vi người dùng thật. Nó giúp trigger các event tải thêm dữ liệu một cách tự nhiên nhất.
async def scroll_page(page):
await page.evaluate("""
async () => {
let totalHeight = 0;
let distance = 200;
while (totalHeight < document.body.scrollHeight) {
window.scrollBy(0, distance);
totalHeight += distance;
await new Promise(r => setTimeout(r, 100));
}
}
""")
3. Áp dụng Page Object Model (POM)
Khi code vượt quá 1000 dòng, đừng nhồi nhét mọi thứ vào một hàm. Hãy chia nhỏ thành các Class đại diện cho từng trang. Điều này giúp bạn sửa lỗi nhanh hơn và dễ dàng bảo trì script sau 3-6 tháng quay lại.
Giám sát và Debug: Tuyệt chiêu Trace Viewer
Chạy script trên server (headless) mà lỗi thì biết đường nào mà lần? Đừng chỉ nhìn log text khô khan.
1. Hộp đen Trace Viewer
Đây là tính năng “vô đối” của Playwright. Nó giống như hộp đen máy bay, ghi lại từng miligiây: video, click, request network và cả lỗi console.
await context.tracing.start(screenshots=True, snapshots=True)
# Logic cào data...
await context.tracing.stop(path="debug_trace.zip")
Bạn chỉ cần kéo file debug_trace.zip vào trace.playwright.dev là thấy toàn bộ diễn biến. Nó giúp mình tiết kiệm hàng giờ đồng hồ ngồi đoán tại sao script bị tạch.
2. Screenshot khi “dính” bẫy
Luôn bọc code trong try...except. Nếu gặp lỗi, hãy chụp ảnh màn hình ngay. Đây là cách nhanh nhất để phát hiện xem website có đổi giao diện hay bạn đang bị dính Captcha/Bot detection hay không.
Cào dữ liệu web JavaScript-heavy không khó nếu bạn biết chọn công cụ. Playwright giúp bạn quẳng gánh lo về trình duyệt để tập trung vào logic lấy data. Hãy bắt đầu từ những script nhỏ, cấu hình Trace Viewer ngay từ đầu và bạn sẽ thấy việc automation chuyên nghiệp hơn hẳn.

