Giao thức Chrome DevTools (CDP) là gì?
Senior Web Scraping Engineer
Tóm tắt:
- Giao thức Chrome DevTools (CDP) là giao thức dây cho phép các công cụ bên ngoài thực hiện, kiểm tra, gỡ lỗi và tối ưu hóa các trình duyệt dựa trên Chromium. Chrome DevTools tự nói chuyện với trình duyệt qua CDP, và Puppeteer, Playwright, và chromedp cũng vậy.
- CDP được tổ chức thành các miền. Mỗi miền —
Page,Network,DOM,Runtime,Target,Browser,Input, và hơn 60 miền khác — xác định các lệnh mà nó chấp nhận và các sự kiện mà nó phát ra. - Vận chuyển là các thông điệp JSON qua WebSocket. Một khách hàng gửi một lệnh dưới dạng đối tượng JSON với
id,method, vàparams; trình duyệt trả lời bằng một kết quả khớp và phát các sự kiện khi chúng xảy ra. - Nó có hai phiên bản. Phiên bản tip-of-tree (
tot) thay đổi thường xuyên mà không có bảo đảm tương thích; phiên bản ổn định1.3(từ Chrome 64) là một tập con được hỗ trợ. - CDP là cách mà tự động hóa hiện đại kết nối với trình duyệt — bao gồm cả những trình duyệt từ xa. Chỉ cần chỉ định một khách hàng CDP vào một điểm cuối WebSocket và nó điều khiển trình duyệt đó, bất kể nó chạy ở đâu.
- Trình duyệt Scraping không có scrapeless là một điểm cuối CDP. Puppeteer, Playwright, hoặc chromedp kết nối với một URL WebSocket và hoạt động với Chromium đám mây thực sự, không thay đổi.
- Miễn phí để bắt đầu. Tài khoản mới của Scraping không có scrapeless bao gồm thời gian chạy Scraping Browser miễn phí — đăng ký tại app.scrapeless.com.
Giới thiệu: ngôn ngữ tự động hóa giao tiếp với Chrome
Giao thức Chrome DevTools là giao diện mà một trình duyệt xuất ra để các công cụ bên ngoài có thể điều khiển và quan sát nó. Khi bạn mở bảng điều khiển DevTools của Chrome và theo dõi các yêu cầu mạng hoặc bước qua JavaScript, bảng điều khiển không truy cập trực tiếp vào trình duyệt — nó đang gửi các lệnh CDP và nhận các sự kiện CDP qua một kết nối. Mọi thư viện tự động hóa trình duyệt được xây dựng trên Chromium đều sử dụng cùng một giao thức ở bên dưới.
Điều đó có ý nghĩa cho việc scraping và kiểm tra vì CDP cho phép một tập lệnh làm những gì một người với DevTools có thể làm: điều hướng, đọc DOM sau khi nó được kết xuất, chặn các yêu cầu, chụp ảnh màn hình, và đánh giá JavaScript trong trang. Hướng dẫn này giải thích CDP là gì, cách các miền và thông điệp của nó hoạt động, và tại sao một điểm cuối CDP chính là những gì bạn kết nối khi điều khiển một trình duyệt đám mây.
CDP là gì, chính xác
Giao thức Chrome DevTools cho phép các công cụ thực hiện, kiểm tra, gỡ lỗi và tối ưu hóa Chromium, Chrome và các trình duyệt dựa trên Blink khác. Đây là một giao diện điều khiển từ xa cho các phần bên trong của trình duyệt, được duy trì bởi đội ngũ Chrome DevTools. Định nghĩa giao thức chính thức liệt kê mọi miền, lệnh, và sự kiện, và trình duyệt xuất ra cùng một định nghĩa tại điểm cuối /json/protocol/ của nó.
CDP không phải là một công cụ scraping tự nó — nó là lớp bên dưới các công cụ. Puppeteer, Playwright, chromedp và Lighthouse đều chuyển đổi các gọi cấp cao của chúng thành các lệnh CDP, đó là lý do tại sao chúng có thể điều khiển bất kỳ trình duyệt nào nói được giao thức này.
Cách tổ chức CDP: miền, lệnh và sự kiện
CDP chia bề mặt của trình duyệt thành các miền, và mỗi miền sở hữu một tập hợp các lệnh và sự kiện. Có hơn 60 miền; những miền mà một scraper thường chạm vào là một tập hợp nhỏ:
| Miền | Điều khiển |
|---|---|
Page |
điều hướng, vòng đời, chụp ảnh màn hình, in-file PDF |
Network |
yêu cầu, phản hồi, tiêu đề, chặn |
DOM |
cây tài liệu, nút, thuộc tính |
Runtime |
đánh giá JavaScript trong ngữ cảnh trang |
Target |
tab, khung và tạo các ngữ cảnh trình duyệt mới |
Input |
sự kiện chuột, bàn phím, và cảm ứng giả lập |
Browser |
các hành động ở cấp trình duyệt và quản lý cửa sổ |
Một lệnh là một yêu cầu bạn gửi đến một miền (ví dụ, Page.navigate). Một sự kiện là một thông điệp mà trình duyệt gửi cho bạn khi có điều gì đó xảy ra (ví dụ, Network.responseReceived). Một cuộc gọi cấp cao như page.goto() của Puppeteer là một lệnh Page.navigate cộng với một sự chờ đợi cho các sự kiện vòng đời ở bên dưới.
Vận chuyển: các thông điệp JSON qua WebSocket
Giao tiếp CDP là các đối tượng JSON tuần tự có cấu trúc cố định, được truyền qua một kết nối WebSocket. Một khách hàng kết nối tới WebSocket gỡ lỗi của trình duyệt, sau đó trao đổi các thông điệp được định nghĩa bởi định dạng dữ liệu JSON.
Một lệnh mang theo một id, một method chỉ tên miền và lệnh, và một đối tượng params:
json
// Lệnh gửi đến trình duyệt
{ "id": 1, "method": "Page.navigate", "params": { "url": "https://example.com" } }
// Kết quả trả về với id tương ứng
{ "id": 1, "result": { "frameId": "…", "loaderId": "…" } }
// Một sự kiện được trình duyệt phát đi (không có id)
{ "method": "Page.loadEventFired", "params": { "timestamp": 12345.6 } }
id liên kết một kết quả với lệnh đã tạo ra nó; các sự kiện đến mà không có id vì trình duyệt phát ra chúng theo lịch trình riêng của nó. Một khách hàng thường mở WebSocket, kích hoạt các miền mà họ quan tâm (Network.enable, Page.enable), sau đó kết hợp các lệnh và sự kiện trong phần còn lại của phiên.
Các phiên bản giao thức: phiên bản mới nhất và ổn định
CDP được phát hành trên hai tuyến đường. Phiên bản mới nhất (tot) theo dõi Chromium mới nhất và thường xuyên thay đổi, không đảm bảo tương thích ngược. Phiên bản ổn định 1.3, được giới thiệu tại Chrome 64, là một tập hợp hỗ trợ mà các công cụ có thể nhắm tới để đảm bảo tính ổn định. Một bề mặt v8-inspector riêng biệt hiển thị cùng một kiểu giao thức để gỡ lỗi và tối ưu hóa Node.js. Hầu hết các thư viện tự động hóa đều gắn với một bản dựng Chromium và sử dụng giao thức tương ứng, đó là lý do tại sao một thư viện và một phiên bản trình duyệt được cho là sẽ di chuyển cùng nhau.
Những gì sử dụng CDP
CDP là nền tảng chung dưới một bộ công cụ rộng lớn:
- Chrome DevTools — bảng điều khiển trong trình duyệt là một khách hàng CDP.
- Puppeteer — kết nối qua CDP theo mặc định.
- Playwright — điều khiển Chromium qua CDP (và thực hiện các giao thức riêng cho Firefox và WebKit).
- chromedp — một thư viện Go nói trực tiếp với CDP.
- Lighthouse — thu thập dữ liệu về hiệu suất và kiểm toán qua CDP.
Vì tất cả đều nói cùng một giao thức, bất kỳ ai trong số họ cũng có thể kết nối với một trình duyệt mà họ không khởi động — miễn là trình duyệt đó cung cấp một điểm cuối CDP. Tiêu chuẩn trên nhiều trình duyệt đang nổi lên, WebDriver BiDi, được xây dựng trên cùng một mô hình lệnh và sự kiện hai chiều mà CDP đã tiên phong.
CDP và trình duyệt đám mây
Một điểm cuối CDP không nhất thiết phải nằm trên máy của bạn. Bởi vì giao thức chạy qua WebSocket, một khách hàng có thể kết nối với một trình duyệt chạy ở bất kỳ đâu — đó chính xác là cách mà một trình duyệt đám mây hoạt động. Trình duyệt Scrapeless Scraping cung cấp một điểm cuối CDP tại một URL WebSocket duy nhất, vì vậy một khách hàng CDP kết nối với một Chromium đám mây thực thay vì một cái cục bộ:
- Puppeteer kết nối với
puppeteer.connect({ browserWSEndpoint }). - Playwright kết nối với
chromium.connectOverCDP(). - chromedp kết nối với
NewRemoteAllocator.
Mã không thay đổi; chỉ có điểm cuối thay đổi. Trình duyệt chạy trên đám mây với dấu vân tay Chromium thực tế và băng thông dân cư, và thư viện nói CDP của bạn điều khiển nó chính xác như nó sẽ làm với một trình duyệt cục bộ.
Điểm cuối tương tự cũng trả lời một vài miền ngoài giao thức gốc — Captcha.* cho phát hiện và giải CAPTCHAs, Agent.* cho các cú nhấp chuột và gõ phím mô phỏng — được tài liệu trên Tài liệu tham khảo API CDP của Scrapeless. Một khách hàng đã nói CDP có thể gọi những điều đó theo cách mà nó gọi Page.navigate.
Lấy khóa API của bạn trên gói miễn phí tại app.scrapeless.com.
Lấy khóa API của bạn trên gói miễn phí: app.scrapeless.com
Kết luận: một giao thức dưới mọi công cụ Chromium
CDP là lớp chung dưới tự động hóa trình duyệt: một bộ miền, được trao đổi dưới dạng các lệnh và sự kiện JSON qua WebSocket, cho phép một công cụ điều khiển và quan sát một trình duyệt Chromium. Hiểu nó giải thích tại sao Puppeteer, Playwright và chromedp cảm thấy tương tự nhau bên dưới, tại sao một thư viện và một phiên bản trình duyệt di chuyển cùng nhau, và tại sao kết nối với một trình duyệt từ xa lại đơn giản như chỉ vào một URL WebSocket khác. Để xem một ví dụ cụ thể về việc điều khiển một trình duyệt đám mây qua CDP từ Python, hãy xem Hướng dẫn sản xuất-scraper của Scrapling, và so sánh các gói trên Trang giá Scrapeless.
Sẵn sàng để điều khiển một trình duyệt đám mây qua CDP?
Tham gia cộng đồng của chúng tôi để nhận gói miễn phí và kết nối với các nhà phát triển xây dựng tự động hóa dựa trên CDP: Discord · Telegram.
Đăng ký tại app.scrapeless.com để nhận runtime Scraping Browser miễn phí và hướng khách hàng CDP của bạn đến một trình duyệt đám mây qua một URL WebSocket.
Câu hỏi thường gặp
H: CDP có giống với WebDriver không?
Không. CDP là giao thức mức thấp, hai chiều do Chromium phát triển (các lệnh và sự kiện qua WebSocket); WebDriver cổ điển là giao thức HTTP yêu cầu-phản hồi được tiêu chuẩn hóa bởi W3C. Tiêu chuẩn WebDriver BiDi mới hơn mang đến một mô hình hai chiều kiểu CDP qua các trình duyệt.
H: Tôi có sử dụng CDP trực tiếp khi viết một trình thu thập dữ liệu không?
Thường thì không. Bạn sử dụng một thư viện — Puppeteer, Playwright, hoặc chromedp — dịch các cuộc gọi của bạn thành các lệnh CDP. Bạn chỉ sử dụng CDP thô cho các khả năng mà thư viện không cung cấp.
H: Playwright có sử dụng CDP không?
Đối với Chromium, có. Playwright điều khiển Chromium qua CDP; đối với Firefox và WebKit, nó sử dụng các giao thức riêng của mình, đó là lý do tại sao một số tính năng đặc biệt của CDP chỉ có trên Chromium.
H: Một công cụ kết nối với một trình duyệt qua CDP như thế nào?
Trình duyệt cung cấp một URL WebSocket để gỡ lỗi. Khách hàng mở URL WebSocket đó và trao đổi các lệnh và sự kiện JSON. Một trình duyệt đám mây như Scrapeless cung cấp cho bạn URL WebSocket đó trực tiếp, vì vậy cùng một khách hàng kết nối với một trình duyệt từ xa.
H: Sự khác biệt giữa tip-of-tree và CDP ổn định là gì?
Tip-of-tree theo dõi phiên bản Chromium mới nhất và có thể thay đổi mà không có thông báo; ổn định 1.3 (từ Chrome 64) là một tập hợp cố định mà các công cụ có thể dựa vào. Các thư viện thường gắn bó với một bản xây dựng Chromium và phiên bản giao thức đi kèm với nó.
Tại Scrapless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định và chính sách bảo mật trang web hiện hành. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động cạo nào, hãy tham khảo ý kiến cố vấn pháp lý của bạn và xem xét các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.



