Cách thu thập dữ liệu các trang được kết xuất bằng JavaScript với Python
TL;DR
Sử dụng một endpoint JSON được ủy quyền khi có thể; nó thường ổn định hơn và rẻ hơn so với việc render một trình duyệt.
Playwright là phương pháp Python chính trong hướng dẫn này vì các locators, contexts, và network controls của nó phù hợp với các trang web được render bởi client hiện đại.
Selenium vẫn hữu ích trong các tổ chức có một stack WebDriver đã được thiết lập.
Scrapy cộng với scrapy-playwright phù hợp với các crawl đã được xếp hàng nơi chỉ các yêu cầu đã chọn cần được render.
Một API rendering được quản lý là phù hợp khi các hoạt động trình duyệt, các lần thử lại, và các artifacts nên là trách nhiệm của dịch vụ.
Tại sao các trang được render bằng JavaScript lại trả về nội dung trống trong Python?
Các trang được render bằng JavaScript trả về nội dung trống hoặc một phần vì requests và các client tương tự tải xuống phản hồi ban đầu nhưng không thực thi ứng dụng. Nstdata Crawl có thể cung cấp một đường dẫn rendering được quản lý, trong khi Playwright, Selenium và scrapy-playwright cho phép Python điều khiển một trình duyệt. Bước chẩn đoán đầu tiên là so sánh Xem Nguồn, DOM đã được render, và các phản hồi Fetch/XHR.
Bài viết rendering JavaScript giải thích tại sao thành công trong điều hướng khác với sự sẵn sàng của nội dung. Một trang khung có thể trả về trạng thái 200 trong khi yêu cầu dữ liệu thất bại sau đó.
Bạn cần gì trước khi scrape một trang đã được render?
Bạn cần sự cho phép, một schema chính xác, một tập hợp mục tiêu nhỏ, ngân sách thời gian và trang rõ ràng, và một hoặc nhiều tín hiệu sẵn sàng có ý nghĩa. Cài đặt các công cụ đã chọn trong một môi trường cô lập.
Trên một trang web mà bạn sở hữu hoặc được phép kiểm tra, mở DevTools → Mạng → Fetch/XHR, tải lại và kích hoạt nội dung. Xác định một yêu cầu công khai trả lại các bản ghi cần thiết.
Bước 2: Phục hồi một yêu cầu
import httpx
r = httpx.get("https://example.com/api/items", params={"page":1}, timeout=20)r.raise_for_status()items = r.json().get("items",[])
Bước 3: Giới hạn phân trang
Dừng trên một con trỏ đã được ghi chép, trang trống, hoặc giới hạn tối đa được cấu hình. Không phát lại các cuộc gọi ứng dụng riêng tư hoặc sao chép thông tin xác thực phiên mà không có sự chấp thuận.
Phương pháp 2: Render với Playwright
Bước 1: Khởi động một ngữ cảnh trình duyệt
from playwright.sync_api import sync_playwright
with sync_playwright()as p: browser = p.chromium.launch(headless=True) page = browser.new_page(viewport={"width":1365,"height":900}) page.goto("https://example.com/app", wait_until="domcontentloaded") page.locator("[data-testid='item']").first.wait_for(timeout=10000) rows = page.locator("[data-testid='item']").all_inner_texts() browser.close()
Bước 2: Chờ bằng chứng, không phải thời gian
Ưu tiên một bộ chọn ổn định hoặc phản hồi cụ thể trả lại dữ liệu. networkidle có thể không phù hợp cho các ứng dụng có phân tích hoặc kết nối lâu dài.
Bước 3: Xác thực trạng thái trang
Kiểm tra URL cuối, tiêu đề, các điều khiển mong đợi, số lượng hàng và một ảnh chụp màn hình khi thất bại. Từ chối các lỗi chung và trạng thái chỉ đồng ý.
Phương pháp 3: Sử dụng Selenium với chờ rõ ràng
Bước 1: Điều hướng với WebDriver
Tạo trình điều khiển, đặt thời gian chờ tải trang và mở một trang đã được phê duyệt. Tránh kết hợp chờ ngầm với chờ rõ ràng vì thời gian kết hợp khó lý luận.
Bước 2: Chờ cho bộ chứa kết quả
Sử dụng WebDriverWait và điều kiện mong đợi cho nội dung thực tế. Tránh time.sleep() như cơ chế sẵn sàng chính.
Bước 3: Luôn đóng trình điều khiển
Sử dụng try/finally hoặc một bộ bao bọc ngữ cảnh để các công việc thất bại không rò rỉ quá trình trình duyệt.
Phương pháp 4: Thêm rendering vào Scrapy một cách chọn lọc
Bước 1: Kích hoạt scrapy-playwright
Cấu hình trình tải xuống và reactor chính xác như đã được ghi chép cho phiên bản đã cài đặt. Ghim các phiên bản Scrapy, Playwright và plugin lại với nhau.
Bước 2: Đánh dấu chỉ các yêu cầu đã được render
Gửi các trang tĩnh thông qua trình tải xuống bình thường của Scrapy và thêm meta={"playwright": True} chỉ ở những nơi cần render. Điều này giữ nguyên tính đồng thời và giảm chi phí trình duyệt.
Bước 3: Đóng các đối tượng trang
Nếu một callback nhận được một trang Playwright, hãy đóng nó trên cả hai đường đi thành công và ngoại lệ. Giám sát các trang mở và bộ nhớ trình duyệt.
Phương pháp 5: Sử dụng dịch vụ rendering được quản lý
Bước 1: Định nghĩa một yêu cầu tối thiểu
Sử dụng Nstdata Crawl để truy cập trang được quản lý, rendering, biến đổi và xử lý tác vụ khi những hoạt động đó không nên sống trong ứng dụng. Yêu cầu chỉ các định dạng và tương tác cần thiết.
Bước 2: Kiểm tra công việc bất đồng bộ có ràng buộc
Sử dụng trạng thái cuối, thời gian tối đa và quay lại tăng dần với jitter. Kiểm tra thông tin success, trạng thái và lỗi ở cấp độ body thay vì chỉ mã vận chuyển.
Bước 3: Xác thực chi phí cho mỗi trang được chấp nhận
Sử dụng Bảng giá Nstdata Crawl cho mô hình thanh toán hiện tại. Bao gồm các trang bị từ chối và thử lại khi so sánh chi phí với các trình duyệt tự quản.
Bạn làm thế nào để thu thập dữ liệu từ cuộn vô tận và nội dung lười biếng?
Ưu tiên con trỏ cơ bản hoặc điểm cuối trang khi cho phép. Nếu cần cuộn, ghi lại số lượng mặt hàng hiện tại, cuộn một lần, chờ tăng lên và dừng khi số lượng không thay đổi hoặc số lần lặp tối đa đạt được. Hình ảnh lười có thể yêu cầu giao điểm chế độ xem, nhưng việc cuộn toàn bộ trang có thể vô tình kích hoạt các nguồn cấp không giới hạn.
Hướng dẫn công cụ thu thập dữ liệu động cung cấp ngữ cảnh lựa chọn phương pháp bổ sung. Giữ việc phát hiện URL và chấp nhận mặt hàng tách biệt để các thẻ lặp lại không trở thành các bản ghi trùng lặp.
Những lỗi nào mà một trình thu thập dữ liệu trang đã được render nên xử lý?
Xử lý thời gian chờ điều hướng, thời gian chờ bộ chọn, sự cố trình duyệt, truy cập bị từ chối, địa phương sai, kết quả trống, thất bại phân tích và thất bại lưu trữ như các trạng thái riêng biệt. Thử lại chỉ các lớp tạm thời. Ghi lại chẩn đoán đã được tinh chế, không phải cookie hoặc token. Giao thức loại trừ Robots là một đầu vào chính sách; nó không thay thế đánh giá pháp lý và hợp đồng.
Kết luận
Sử dụng điểm cuối mạng trước, Playwright cho các trang phụ thuộc vào trình duyệt hiện đại, Selenium cho các môi trường WebDriver đã được thiết lập, và scrapy-playwright cho việc kết xuất chọn lọc bên trong một quá trình thu thập dữ liệu. Chuyển sang dịch vụ được quản lý khi các hoạt động trình duyệt thay vì logic trích xuất tiêu tốn ngân sách kỹ thuật. Xác thực mọi phương pháp trên cùng một tập hợp dữ liệu và đo lường số lượng bản ghi được chấp nhận. Nstdata Proxy Manager có thể được đánh giá một cách riêng biệt khi định tuyến và theo dõi qua các nguồn proxy trở thành mối quan tâm riêng biệt.
Trải nghiệm Nstdata — Bắt đầu dùng thử miễn phí của bạn hôm nay
H: Beautiful Soup có thể thu thập nội dung được kết xuất bằng JavaScript không?
Beautiful Soup có thể phân tích HTML đã được kết xuất sau khi một công cụ khác thực thi JavaScript, nhưng nó không tự chạy JavaScript.
H: Playwright có nên chờ networkidle không?
Chỉ khi trạng thái mạng yên tĩnh là một điều kiện có ý nghĩa cho mục tiêu. Một bộ chọn ổn định hoặc phản hồi dữ liệu đã biết thường chính xác hơn.
H: Scrapy có thể kết xuất JavaScript không?
Scrapy không tự kết xuất JavaScript, nhưng các tích hợp như scrapy-playwright có thể định tuyến các yêu cầu đã chọn qua một trình duyệt.
H: Tại sao chế độ headless lại trả về nội dung khác nhau?
Viewport, ngôn ngữ, phiên bản trình duyệt, thời gian, quyền, và hành vi mục tiêu có thể khác nhau. So sánh các cấu hình và giữ lại một ảnh chụp màn hình trước khi giả định bộ chọn là sai.
H: Bao nhiêu trang trình duyệt nên chạy đồng thời?
Độ đồng thời phụ thuộc vào bộ nhớ, CPU, chính sách mục tiêu, và trọng lượng trang. Bắt đầu với số thấp, đo lường việc sử dụng tài nguyên trình duyệt và tỷ lệ trang được chấp nhận, và đặt một giới hạn cứng.
Các trang được rend bằng JavaScript yêu cầu phương thức phù hợp với đường dẫn dữ liệu của chúng. Hướng dẫn này sẽ đề cập đến việc trích xuất mạng, ba phương pháp trình duyệt và việc render được quản lý.
Ivy Lin
Sep. 28th 2026
Trải nghiệm Nstproxy Crawl - Bắt Đầu Dùng Thử Miễn Phí Hôm Nay
Thu thập toàn bộ trang web chỉ với một yêu cầu API
Chuyển mọi trang web thành Markdown, HTML, JSON, liên kết, PDF và hơn thế nữa mà không cần quản lý hạ tầng thu thập dữ liệu.
Tỷ lệ thành công 99,8% với kết xuất JavaScript
Nhận dữ liệu sạch, sẵn sàng cho LLM ở nhiều định dạng