Bạn cần lấy tiêu đề, giá hay đường dẫn từ vài chục trang web vào một bảng tính để so sánh, nhưng không biết lập trình và không muốn cài phần mềm. Google Sheets có sẵn hàm IMPORTXML làm được việc này chỉ bằng một công thức. Bài này hướng dẫn từng bước, kèm bảng công thức mẫu và những giới hạn khiến bạn nên chuyển sang cách khác.
IMPORTXML là gì và hợp với việc gì
Theo trợ giúp của Google Docs, IMPORTXML nhập dữ liệu từ nhiều kiểu dữ liệu có cấu trúc, gồm XML, HTML, CSV, TSV và nguồn tin RSS, ATOM. Cú pháp:
=IMPORTXML(url; xpath_query)
- url: địa chỉ trang, có cả phần https://, đặt trong ngoặc kép hoặc trỏ tới một ô.
- xpath_query: “đường dẫn” chỉ tới phần dữ liệu cần lấy trong trang, viết theo cú pháp XPath.
- Tham số thứ ba (tuỳ chọn) là mã ngôn ngữ, khu vực dùng khi đọc số và ngày.
Về dấu ngăn cách: cách viết công thức phụ thuộc cài đặt khu vực của bảng tính (Tệp, Cài đặt). Có khu vực dùng dấu phẩy, có khu vực dùng dấu chấm phẩy giữa các tham số. Nếu Sheets báo lỗi cú pháp, đổi dấu này trước tiên.
Hàm này hợp với việc nhỏ, làm một lần hoặc theo dõi nhẹ: lấy tiêu đề và mô tả của danh sách trang, gom tin mới từ nguồn RSS, so giá công khai của vài sản phẩm.
Bước 1: Tìm XPath của dữ liệu cần lấy
- Mở trang cần lấy trên Chrome, bấm chuột phải vào đúng chữ hoặc con số bạn muốn, chọn Kiểm tra (Inspect).
- Ở khung mã hiện ra, dòng tương ứng được tô sáng. Xem thẻ (như h1, span, a) và tên lớp (class) của nó.
- Viết XPath ngắn theo mẫu
//thẻ[@class='tên-lớp']. Có thể bấm chuột phải vào dòng mã, chọn Copy XPath, nhưng đường dẫn chép tự động thường dài và dễ gãy khi trang đổi bố cục, nên ưu tiên viết ngắn theo tên lớp.
Bước 2: Viết công thức, bắt đầu từ mẫu
Đặt địa chỉ trang ở ô A2, rồi dán một trong các công thức dưới vào ô B2. Thay dấu chấm phẩy bằng dấu phẩy nếu bảng tính của bạn dùng dấu phẩy.
| Muốn lấy | Công thức | Ghi chú |
|---|---|---|
| Tiêu đề trang | =IMPORTXML(A2; "//title") | Tiêu đề hiện trên thẻ trình duyệt |
| Mô tả trang | =IMPORTXML(A2; "//meta[@name='description']/@content") | Trống nếu trang không khai báo |
| Tiêu đề lớn H1 | =IMPORTXML(A2; "//h1") | Thường là tên sản phẩm, tên bài |
| Mọi tiêu đề H2 | =IMPORTXML(A2; "//h2") | Trả về nhiều dòng |
| Mọi đường dẫn | =IMPORTXML(A2; "//a/@href") | Có cả liên kết menu, chân trang |
| Giá theo tên lớp | =IMPORTXML(A2; "//span[@class='price']") | Thay “price” bằng lớp thật bạn tìm ở bước 1 |
Nếu dữ liệu nằm sẵn trong một bảng hoặc danh sách trên trang, dùng hàm anh em IMPORTHTML cho gọn: =IMPORTHTML(A2; "table"; 1) lấy bảng thứ nhất, đổi “table” thành “list” để lấy danh sách. Theo trợ giúp của Google, số thứ tự bắt đầu từ 1 và bảng, danh sách được đánh số riêng.
Bước 3: Lấy nhiều trang cùng lúc
Dán danh sách địa chỉ vào cột A, mỗi ô một địa chỉ. Viết công thức ở B2 rồi kéo xuống hết danh sách. Mỗi cột một loại dữ liệu: cột B tiêu đề, cột C giá, cột D mô tả. Khi đã có kết quả ưng ý mà không cần cập nhật nữa, chép cả vùng và dán dạng “chỉ giá trị” để bảng tính khỏi tải lại liên tục.
Giới hạn cần biết, và khi nào đổi cách
- Không đọc được nội dung do JavaScript vẽ ra. IMPORTXML chỉ thấy mã trang máy chủ gửi về. Nhiều cửa hàng hiện giá, đánh giá bằng JavaScript sau khi trang tải, công thức sẽ trả về rỗng hoặc lỗi.
- Cập nhật chậm. Theo trợ giúp của Google, các hàm IMPORTXML, IMPORTHTML, IMPORTDATA, IMPORTFEED được tính lại mỗi giờ, nên không hợp để theo dõi giá từng phút.
- Bị chặn hoặc chậm khi nhiều. Có website chặn yêu cầu từ máy chủ Google; hàng trăm công thức trong một bảng làm bảng tính chạy rất chậm.
- Không đăng nhập được. Hàm chỉ đọc trang công khai.
Gặp các giới hạn này, bước tiếp theo là chạy một đoạn mã ngay trong trình duyệt, xem bài Công cụ cào dữ liệu có sẵn trong trình duyệt. Việc lớn, cần chạy đều đặn thì nên thuê người làm, đọc trước bài Thuê dịch vụ web scraping: hỏi gì trước khi thuê. Và dù dùng cách nào, hãy kiểm tra dữ liệu mình lấy có được phép không theo bài Cào dữ liệu website có hợp pháp không.
Nếu dữ liệu bạn gom được sẽ thành danh mục sản phẩm hay bảng giá trên website mới, hãy thống nhất định dạng cột với đơn vị làm web ngay từ đầu để nhập một lần là xong; các bước chúng tôi làm việc với khách có ở trang Quy trình.
Tóm lại
- IMPORTXML lấy dữ liệu từ trang công khai vào Google Sheets bằng một công thức gồm địa chỉ trang và XPath.
- Tìm XPath bằng Kiểm tra (Inspect) trên Chrome, ưu tiên XPath ngắn theo tên lớp; bảng, danh sách thì dùng IMPORTHTML.
- Hàm không đọc nội dung do JavaScript vẽ, tính lại mỗi giờ và chậm khi nhiều; việc lớn thì chuyển sang mã trong trình duyệt hoặc thuê người làm.