Beautiful Soup chỉ đọc được HTML tĩnh. Với trang dựng bằng JavaScript — dashboard, ứng dụng React — bạn cần một trình duyệt thật. Playwright điều khiển trình duyệt đó bằng Python.
Cài đặt
pip install playwright
playwright install chromium
Ví dụ đầu tiên
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
trinh_duyet = p.chromium.launch(headless=True)
trang = trinh_duyet.new_page()
trang.goto("https://example.com")
print(trang.title())
trang.screenshot(path="anh.png", full_page=True)
trinh_duyet.close()
Tương tác với trang
trang.fill("#username", "[email protected]")
trang.fill("#password", "matkhau")
trang.click("button[type=submit]")
trang.wait_for_url("**/dashboard")
trang.get_by_role("button", name="Xuất báo cáo").click()
Playwright tự chờ phần tử xuất hiện và sẵn sàng nhận thao tác. Bạn hầu như không cần time.sleep() — đây là khác biệt lớn so với Selenium.
Lấy dữ liệu
trang.goto("https://example.com/san-pham")
trang.wait_for_selector(".product-card")
for the in trang.query_selector_all(".product-card"):
ten = the.query_selector("h3").inner_text()
gia = the.query_selector(".price").inner_text()
print(ten, gia)
Đăng nhập một lần, dùng lại nhiều lần
# Lần đầu: đăng nhập rồi lưu trạng thái
trang.context.storage_state(path="phien.json")
# Các lần sau
context = trinh_duyet.new_context(storage_state="phien.json")
trang = context.new_page() # đã đăng nhập sẵn
Tải file
with trang.expect_download() as tai_ve:
trang.click("text=Tải CSV")
tai_ve.value.save_as("baocao.csv")
Chạy trên server không màn hình
playwright install --with-deps chromium # cài luôn thư viện hệ thống
Với Docker, hãy dùng image chính thức mcr.microsoft.com/playwright/python — nó đã có sẵn mọi phụ thuộc.
Dùng có trách nhiệm
- Đọc
robots.txtvà điều khoản sử dụng của trang. - Thêm độ trễ giữa các yêu cầu, đừng dội hàng nghìn request.
- Nếu trang có API công khai, hãy dùng API — nhanh hơn và ổn định hơn nhiều.
- Không tự động vượt CAPTCHA hay đăng nhập vào tài khoản không phải của bạn.
Ngoài scraping, Playwright còn rất mạnh cho kiểm thử end-to-end: viết một lần, chạy trên Chromium, Firefox và WebKit.
