Quay lại blog

Chơi với Ruby: Một Hướng Dẫn Thực Tế Về Tìm Kiếm Web

Daniel Kim
Daniel Kim

Lead Scraping Automation Engineer

13-Aug-2026

TL;DR:

  • Ruby có thể điều khiển Playwright thông qua playwright-ruby-client. Cài đặt phiên bản playwright-core tương thích được báo cáo bởi gem.
  • Sử dụng bộ xác định và chờ rõ ràng cho các trang động. Hướng dẫn này trích xuất hai trang được chuyển đổi bằng JavaScript và trả về các bản ghi có cấu trúc.
  • Giữ nguồn gốc trong mỗi hàng. Lưu URL nguồn cùng với văn bản và tác giả để các lỗi phân trang vẫn có thể truy vết.
  • Đóng trình duyệt và phân trang ràng buộc. Giới hạn tài nguyên và điều kiện dừng có ý nghĩa trước khi một trình thu thập dữ liệu trở thành một công việc theo lịch trình.
  • Playwright cục bộ có ranh giới hoạt động. Scrapeless Scraping Browser có thể cung cấp một điểm cuối CDP được quản lý trong khi Ruby giữ lại logic trích xuất.

Playwright không công bố một liên kết Ruby chính thức, nhưng playwright-ruby-client được duy trì bởi cộng đồng cung cấp một khách hàng thực tế cho giao thức Playwright. Nó hoạt động tốt cho các ứng dụng Ruby cần chuyển đổi JavaScript, bộ xác định đáng tin cậy và điều hướng trình duyệt mà không cần chuyển toàn bộ dự án sang Node.js.

Hướng dẫn này cài đặt các phiên bản tương thích, thu thập dữ liệu từ hai trang trong một bản demo JavaScript công khai, xuất dữ liệu có cấu trúc, và giải thích cách di chuyển quy trình trình duyệt sang Scrapeless khi các hoạt động trình duyệt cục bộ trở thành nút thắt.

Prerequisites

Bạn cần Ruby, Bundler, Node.js, và một trình duyệt dựa trên Chromium đã được cài đặt. Chạy xác minh đã sử dụng Ruby 2.6.10, playwright-ruby-client 1.62.0, playwright-core 1.62.1, và Google Chrome.

Phiên bản chính xác của Playwright Core là quan trọng. Kho playwright-ruby-client hướng dẫn người dùng truy vấn gem để lấy phiên bản giao thức tương thích của nó thay vì cài đặt một gói mới nhất tùy ý.

Install Playwright for Ruby

Tạo một dự án và thêm gem:

ruby Copy
# Gemfile
source 'https://rubygems.org'

gem 'playwright-ruby-client'

Cài đặt nó, in phiên bản Playwright tương thích, và cài đặt gói Node chính xác đó:

bash Copy
bundle install
PLAYWRIGHT_CLI_VERSION=$(bundle exec ruby -e 'require "playwright/version"; puts Playwright::COMPATIBLE_PLAYWRIGHT_VERSION')
npm install "playwright-core@$PLAYWRIGHT_CLI_VERSION"

Nếu không có trình duyệt cục bộ, ./node_modules/.bin/playwright-core install chromium tải xuống phiên bản Chromium tương thích. Ví dụ dưới đây thì chỉ vào một tệp thực thi Chrome hiện có.

Trang tài liệu của khách hàng cộng đồng bao gồm API trình duyệt được hỗ trợ. Bản demo trích dẫn JavaScript là mục tiêu được sử dụng ở đây.

Scrape a Dynamic Page With Ruby

Tạo scrape_quotes.rb:

ruby Copy
require 'json'
require 'playwright'

chrome = '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'
cli = './node_modules/.bin/playwright-core'
rows = []

Playwright.create(playwright_cli_executable_path: cli) do |playwright|
  playwright.chromium.launch(headless: true, executablePath: chrome) do |browser|
    page = browser.new_page
    page.goto('https://quotes.toscrape.com/js/page/1/', waitUntil: 'domcontentloaded')

    2.times do
      page.locator('.quote').first.wait_for

      page.locator('.quote').all.each do |quote|
        rows << {
          text: quote.locator('.text').text_content,
          author: quote.locator('.author').text_content,
          source_url: page.url
        }
      end

      next_link = page.locator('li.next a')
      break if next_link.count.zero?

      next_link.click
      page.locator('.quote').first.wait_for
    end
  end
end

puts JSON.pretty_generate({ count: rows.length, first: rows.first, last: rows.last })

Chạy nó với:

bash Copy
bundle exec ruby scrape_quotes.rb

Chạy xác minh đã trả về 20 bản ghi: bản ghi đầu tiên đến từ trang 1 và bản ghi cuối cùng từ trang 2. Điều đó chứng minh bộ chọn đã được chuyển đổi, nhấp phân trang, chờ và đường dẫn xuất dữ liệu có cấu trúc trên mẫu này. Đó không phải là một chuẩn mực thông lượng.

Why the Script Uses Locators and Waits

HTML ban đầu trên một trang động có thể không chứa các bản ghi. page.goto chờ sự kiện tài liệu, trong khi locator('.quote').first.wait_for chờ phần tử kinh doanh cần thiết cho trình thu thập dữ liệu.

Sự phân biệt đó giúp tránh việc nghỉ cố định. Một độ trễ hai giây có thể lâu hơn mức cần thiết trong một lần chạy và quá ngắn trong lần khác. Một chờ bộ xác định biểu thị điều kiện chấp nhận thực tế.

Bộ xác định cũng giữ cho các truy vấn có thể cấu thành. Kịch bản tìm mỗi .quote, sau đó giới hạn .text.author trong hàng đó. Điều này ngăn tác giả từ một thẻ được ghép với văn bản từ thẻ khác.

Add Safe Pagination and Structured Output

Mỗi vòng lặp phân trang cần một điều kiện dừng. Hướng dẫn này sử dụng 2.times, sau đó thoát sớm nếu không có liên kết tiếp theo. Một công việc sản xuất có thể kết hợp giới hạn trang với một tập hợp URL đã truy cập và một khóa loại bỏ bản ghi.

Giữ source_url với mỗi bản ghi. Khi một bộ chọn thay đổi hoặc một bản sao xuất hiện, nguồn gốc làm cho việc tái tạo lại trang và phân biệt lỗi phân tích với các thay đổi từ nguồn trở nên khả thi.

Đối với đầu ra tệp, thay thế puts cuối cùng bằng File.write('quotes.json', JSON.pretty_generate(rows)). Ghi vào một tệp tạm thời và chỉ đổi tên nó sau khi xác minh nếu các trình đọc dòng dưới có thể tiêu thụ đầu ra đồng thời.

Control Browser Resources

Hình thức khối của launch đóng trình duyệt khi khối kết thúc, bao gồm hầu hết các ngoại lệ. Các công việc theo lịch trình cũng nên giới hạn:

  • số trang tối đa và độ sâu điều hướng;
  • các ngữ cảnh trình duyệt đồng thời;
  • thời gian chờ điều hướng và bộ xác định;
  • lưu giữ ảnh chụp màn hình và theo dõi;
  • loại phản hồi được chấp nhận và kích thước tải tối đa.

Một trang trả về trạng thái 200 vẫn có thể là biểu diễn sai. Xác minh URL cuối cùng, tiêu đề trang, bộ chọn cần thiết và ít nhất một định danh kinh doanh trước khi lưu các bản ghi. Quy định các ngữ nghĩa HTTP giải thích trạng thái phản hồi, nhưng danh tính ở cấp ứng dụng vẫn là trách nhiệm của trình thu thập dữ liệu.

Where Local Playwright Stops

Local Playwright giữ cho mã đơn giản trong quá trình phát triển. Trong môi trường sản xuất, nhóm cũng duy trì các tệp nhị phân trình duyệt tương thích, phụ thuộc hệ điều hành, dọn dẹp quy trình, phân bổ bộ nhớ, định tuyến địa lý, phân lập phiên và chẩn đoán.

Clien Ruby yêu cầu một máy chủ Playwright hoặc CLI nói bằng giao thức tương thích. Cập nhật gói mà không có phiên bản playwright-core tương ứng có thể làm gãy ranh giới đó. Đặt chốt cả hai gói và cập nhật chúng cùng nhau.

Scrapeless Scraping Browser di chuyển quy trình trình duyệt đến một dịch vụ được quản lý. Scrapeless tài liệu hóa cả SDK của nó và một URL kết nối CDP trong hướng dẫn tích hợp Playwright.

Kết nối Ruby với một phiên Scrapeless Browser

Điều kiện tiên quyết: một kết nối đám mây trực tiếp yêu cầu một khóa API Scrapeless do người đọc sở hữu. Kịch bản thu thập dữ liệu Ruby cục bộ đã chạy thành công; bắt tay đám mây đã không được thực hiện trong môi trường này vì không có SCRAPELESS_API_KEY.

Kiến trúc tài liệu có hai mặt:

  1. tạo một phiên trình duyệt Scrapeless được quản lý với SDK Scrapeless hoặc điểm cuối trình duyệt được tài liệu hóa;
  2. cung cấp cho Ruby điểm cuối WebSocket kết quả và kết nối thông qua phương pháp trình duyệt từ xa được hỗ trợ bởi client.

Clien Ruby tài liệu Playwright.connect_to_browser_server cho WebSocket máy chủ Playwright. Scrapeless phơi bày một điểm cuối CDP, vì vậy hãy xác nhận tính tương thích CDP hiện tại của client Ruby trước khi kết nối trực tiếp. Khi tính tương thích trực tiếp không chắc chắn, giữ một dịch vụ kết nối Node nhỏ tại ranh giới trình duyệt và gửi kết quả trang có cấu trúc đến Ruby. Đừng thay thế lặng lẽ một giao thức WebSocket này bằng một giao thức khác.

Ranh giới rõ ràng đó an toàn hơn so với việc công bố một đoạn kết nối chưa được thử nghiệm. Nó bảo tồn logic trích xuất Ruby đã được xác minh trong khi để lại việc tạo phiên và thích ứng giao thức trong một thành phần có thể được kiểm tra tích hợp với một tài khoản thực.

Kết luận

Playwright với Ruby là thực tế khi gói và playwright-core được ghép cặp chính xác. Các trình tìm kiếm, thời gian chờ cho phần tử doanh nghiệp, phân trang giới hạn, nguồn gốc, và dọn dẹp trình duyệt biến một bản demo thành một điểm khởi đầu đáng tin cậy.

Sử dụng Chrome cục bộ trong quá trình phát triển. Di chuyển quy trình trình duyệt đến Scrapeless khi việc cài đặt, mở rộng, định tuyến, và chẩn đoán trở thành gánh nặng hoạt động lặp lại, và kiểm tra ranh giới giao thức từ xa với một thông tin xác thực thực trước khi triển khai.


Xây dựng Ranh giới Trình duyệt Một lần

Đọc hướng dẫn Playwright Stealth, so sánh giá hiện tại, sau đó tạo một tài khoản Scrapeless và xác minh một phiên được quản lý với khóa API của riêng bạn.


Câu hỏi thường gặp

Q: Playwright có chính thức hỗ trợ Ruby không?

Microsoft Playwright không phát hành một ràng buộc Ruby chính thức; playwright-ruby-client là một client do cộng đồng duy trì.

Q: Phiên bản Playwright nào mà Ruby nên sử dụng?

Truy vấn Playwright::COMPATIBLE_PLAYWRIGHT_VERSION từ gói đã cài đặt và cài đặt phiên bản playwright-core chính xác đó.

Q: Làm thế nào để tôi đợi nội dung JavaScript trong Ruby Playwright?

Đợi một trình tìm kiếm đại diện cho nội dung doanh nghiệp cần thiết thay vì phụ thuộc vào một giấc ngủ cố định.

Q: Làm thế nào để phân trang nên được giới hạn?

Sử dụng số lượng trang tối đa, dừng lại khi liên kết tiếp theo biến mất, và theo dõi các URL đã truy cập hoặc ghi nhận các khóa.

Q: Ruby có thể kết nối trực tiếp đến Scrapeless Scraping Browser không?

Scrapeless phơi bày một điểm cuối CDP, trong khi client cộng đồng Ruby tài liệu hóa một kết nối máy chủ Playwright; xác minh tính tương thích giao thức với một tài khoản thực hoặc sử dụng một ranh giới Node nhỏ đã được thử nghiệm.

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.

Bài viết phổ biến nhất

Danh mục