Cách Scrape Giá Khách Sạn Google với Node.js

Advanced Data Extraction Specialist
Thay đổi theo mùa, nhu cầu biến động và các hoạt động khuyến mãi khiến giá khách sạn thay đổi thường xuyên. Theo dõi thủ công những thay đổi này gần như là không thể. Thay vào đó, tự động hóa quá trình này bằng cách thu thập dữ liệu từ các trang web và nền tảng du lịch có thể tiết kiệm thời gian và công sức.
Trong bài viết này, chúng tôi sẽ hướng dẫn bạn cách thu thập dữ liệu giá khách sạn từ một trong những công cụ tổng hợp lớn nhất: Google. Bằng cách thu thập dữ liệu khách sạn của Google, bạn có thể nhanh chóng thu thập thông tin rộng rãi về giá khách sạn, xếp hạng và tiện nghi để phân tích, so sánh giá hoặc các chiến lược định giá động.
Tại sao nên thu thập dữ liệu giá khách sạn Google?

Khi bạn tìm kiếm các từ khóa liên quan đến khách sạn, Google sẽ tạo ra một phần khách sạn chuyên dụng bao gồm tên, hình ảnh, địa chỉ, xếp hạng và giá cả của hàng nghìn khách sạn. Điều này là do Google tổng hợp thông tin từ hàng triệu trang web du lịch và khách sạn vào một nơi duy nhất.
Du khách, doanh nghiệp và nhà phân tích có thể sử dụng dữ liệu này cho nhiều mục đích khác nhau:
- So sánh giá: So sánh giá trên các nền tảng đặt phòng và trang web du lịch khác nhau để tìm ra những ưu đãi tốt nhất.
- Phân tích dữ liệu: Các nhà phân tích có thể sử dụng dữ liệu giá khách sạn để tìm ra xu hướng giá cả, sự biến động theo mùa và các cơ hội cạnh tranh.
- Chiến lược định giá động: Các doanh nghiệp có thể tối ưu hóa doanh thu và tỷ lệ lấp đầy bằng cách điều chỉnh giá dựa trên nhu cầu, khả năng cung cấp và giá của đối thủ cạnh tranh.
- Cảnh báo tùy chỉnh: Theo dõi sự giảm giá để cảnh báo khách hàng hoặc để sử dụng cá nhân.
- Dịch vụ tổng hợp du lịch: Cung cấp cho người dùng cái nhìn tổng hợp về giá cả và lựa chọn khách sạn từ nhiều nguồn khác nhau.
- Lập ngân sách và lập kế hoạch: Du khách có thể dự đoán chi phí chỗ ở và điều chỉnh kế hoạch của họ cho phù hợp.
Tóm lại, các công dụng của dữ liệu này rất rộng lớn, nhưng trước khi bạn có thể thu được thông tin chi tiết, bạn cần phải thu thập nó.
Cách thu thập dữ liệu giá khách sạn Google bằng Node.js
Trong hướng dẫn này, chúng tôi sẽ viết một script để thu thập dữ liệu giá khách sạn và sắp xếp danh sách khách sạn từ rẻ nhất đến đắt nhất, tập trung vào các khách sạn ở New York.
1. Điều kiện tiên quyết
Để làm theo hướng dẫn này, bạn cần cài đặt các công cụ sau trên máy tính của mình:
- Node.js 18+ và NPM
- Kiến thức cơ bản về JavaScript và API của Node.js
2. Thiết lập dự án
Tạo một thư mục dự án:
mkdir google-hotel-scraper
Tiếp theo, khởi tạo một dự án Node.js bằng cách chạy lệnh sau:
cd google-hotel-scraper
npm init -y
Lệnh này sẽ tạo một tệp package.json trong thư mục. Tạo một tệp index.js và thêm một câu lệnh JavaScript đơn giản:
touch index.js
echo "console.log('Hello world!');" > index.js
Chạy tệp index.js bằng thời gian chạy Node.js:
node index.js
Nếu "Hello world!" được in trong thiết bị đầu cuối, dự án của bạn đã hoạt động.
3. Cài đặt các phụ thuộc cần thiết
Để xây dựng trình thu thập dữ liệu của chúng tôi, chúng tôi cần hai gói Node.js:
- Puppeteer: Để tải các trang Khách sạn Google và tải xuống nội dung HTML.
- Cheerio: Để trích xuất thông tin khách sạn từ HTML được tải xuống bởi Puppeteer.
Cài đặt các gói này bằng lệnh sau:
npm install puppeteer cheerio
4. Xác định thông tin cần thu thập từ trang Khách sạn Google
Để trích xuất thông tin từ một trang web, trước tiên chúng ta cần xác định các bộ chọn DOM nhắm mục tiêu đến các phần tử HTML mong muốn.
Dưới đây là bảng các bộ chọn DOM cho từng phần dữ liệu liên quan:
Thông tin | Bộ chọn DOM | Mô tả |
---|---|---|
Khách sạn Container | .uaTTDe |
Một mục khách sạn đơn lẻ trong danh sách kết quả |
Tên khách sạn | .QT7m7 > h2 |
Tên của khách sạn |
Giá khách sạn | .kixHKb > span |
Giá phòng cho một đêm |
Sao khách sạn | .HlxIlc .UqrZme |
Số sao |
Xếp hạng khách sạn | .oz2bpb > span |
Nhận xét của khách hàng về khách sạn |
Tùy chọn khách sạn | .HlxIlc .XX3dkb |
Các dịch vụ bổ sung được cung cấp |
Hình ảnh khách sạn | .EyfHd .x7VXS |
Hình ảnh của khách sạn |
5. Thu thập dữ liệu trang Khách sạn Google
Với các bộ chọn DOM đã được xác định, hãy sử dụng Puppeteer để tải xuống HTML của trang. Trang ban đầu chúng ta đang nhắm mục tiêu là: https://www.google.com/travel/search.
Ở một số quốc gia (chủ yếu ở Châu Âu), một trang đồng ý sẽ được hiển thị trước khi chuyển hướng đến URL. Chúng tôi sẽ thêm mã để nhấp vào nút "Từ chối tất cả", chờ ba giây và đảm bảo trang Khách sạn Google đã được tải đầy đủ.
Cập nhật tệp index.js bằng mã sau:
const puppeteer = require('puppeteer');
const PAGE_URL = 'https://www.google.com/travel/search';
const waitFor = (timeInMs) => new Promise(r => setTimeout(r, timeInMs));
const main = async () => {
const browser = await puppeteer.launch({ headless: 'new' });
const page = await browser.newPage();
await page.goto(PAGE_URL);
const buttonConsentReject = await page.$('.VfPpkd-LgbsSe[aria-label="Reject all"]');
await buttonConsentReject?.click();
await waitFor(3000);
const html = await page.content();
await browser.close();
console.log(html);
}
void main();
Chạy mã bằng node index.js. Thiết bị đầu cuối sẽ xuất nội dung HTML của trang.
6. Trích xuất thông tin từ HTML
Mặc dù chúng ta đã có HTML của trang, nhưng việc trích xuất dữ liệu có giá trị trực tiếp từ HTML thô là một thách thức. Đây là lúc Cheerio phát huy tác dụng.
Mã sau tải HTML và trích xuất giá phòng cho mỗi khách sạn:
const cheerio = require("cheerio");
const $ = cheerio.load(html);
$('.uaTTDe').each((i, el) => {
const priceElement = $(el).find('.kixHKb span').first();
console.log(priceElement.text());
});
Cập nhật tệp index.js để trích xuất nội dung bằng Cheerio, lưu trữ nó trong một mảng và sắp xếp nó theo giá từ thấp đến cao:
const cheerio = require("cheerio");
const puppeteer = require("puppeteer");
const { sanitize } = require("./utils");
const waitFor = (timeInMs) => new Promise(r => setTimeout(r, timeInMs));
const GOOGLE_HOTEL_PRICE = 'https://www.google.com/travel/search';
const main = async () => {
const browser = await puppeteer.launch({ headless: 'new' });
const page = await browser.newPage();
await page.goto(GOOGLE_HOTEL_PRICE);
const buttonConsentReject = await page.$('.VfPpkd-LgbsSe[aria-label="Reject all"]');
await buttonConsentReject?.click();
await waitFor(3000);
const html = await page.content();
await browser.close();
const hotelsList = [];
const $ = cheerio.load(html);
$('.uaTTDe').each((i, el) => {
const titleElement = $(el).find('.QT7m7 > h2');
const priceElement = $(el).find('.kixHKb span').first();
const reviewsElement = $(el).find('.oz2bpb > span');
const hotelStandingElement = $(el).find('.HlxIlc .UqrZme');
const options = [];
const pictureURLs = [];
$(el).find('.HlxIlc .XX3dkb').each((i, element) => {
options.push($(element).find('span').last().text());
});
$(el).find('.EyfHd .x7VXS').each((i, element) => {
pictureURLs.push($(element).attr('src'));
});
const hotelInfo = sanitize({
title: titleElement.text(),
price: priceElement.text(),
standing: hotelStandingElement.text(),
averageReview: reviewsElement.eq(0).text(),
reviewsCount: reviewsElement.eq(1).text(),
options,
pictures: pictureURLs,
});
hotelsList.push(hotelInfo);
});
const sortedHotelsList = hotelsList.slice().sort((hotelOne, hotelTwo) => {
if (!hotelTwo.price) {
return 1;
}
return hotelOne.price - hotelTwo.price;
});
console.log(sortedHotelsList);
}
void main();
Chạy mã và xem kết quả. Bạn vừa thu thập thông tin về tất cả các khách sạn trên.
Trong nội dung trước, chúng tôi đã thực hiện việc thu thập dữ liệu giá khách sạn Google thông qua Node.js và Puppeteer. Mặc dù phương pháp này có thể đáp ứng các nhu cầu cơ bản, nhưng nó yêu cầu viết rất nhiều mã và có thể gặp nhiều thách thức khi xử lý các cơ chế chống thu thập dữ liệu phức tạp.
Để hoàn thành nhiệm vụ hiệu quả hơn, chúng tôi có thể đề xuất một phương pháp đơn giản hơn: sử dụng Scrapeless Deep SerpAPI.
Sử dụng Scrapeless Deep SerpApi để thu thập thông tin khách sạn Google
Deep SerpApi là một công cụ tìm kiếm chuyên dụng được thiết kế cho các mô hình ngôn ngữ lớn (LLM) và các tác nhân AI, nhằm mục đích cung cấp thông tin chính xác và không thiên vị theo thời gian thực để giúp các ứng dụng AI truy xuất và xử lý dữ liệu hiệu quả.

Nó có thể giúp các nhà phát triển nhanh chóng có được kết quả cho hơn 20 kịch bản khác nhau của công cụ tìm kiếm Google. Nó hỗ trợ nhiều cài đặt tham số, có thể tùy chỉnh tìm kiếm dựa trên khu vực, ngôn ngữ và loại thiết bị, và cung cấp dữ liệu JSON có cấu trúc để các nhà phát triển sử dụng trực tiếp.

Ưu điểm của Deep SerpAPI
-
Giá thấp nhất: Deep SerpAPI có giá thấp tới 0,1 đô la/k. Đây là mức giá thấp nhất trên thị trường.
-
Dễ sử dụng: Không cần viết mã phức tạp, chỉ cần lấy dữ liệu thông qua các cuộc gọi API.
-
Thời gian thực: Mỗi yêu cầu có thể ngay lập tức trả về kết quả tìm kiếm mới nhất để đảm bảo tính kịp thời của dữ liệu.
-
Hỗ trợ toàn cầu: Thông qua các địa chỉ IP toàn cầu và cụm trình duyệt, đảm bảo rằng kết quả tìm kiếm nhất quán với trải nghiệm của người dùng thực.
-
Các loại dữ liệu phong phú: Hỗ trợ hơn 20 loại tìm kiếm như Google Search, Google Maps, Google Shopping, v.v.
-
Tỷ lệ thành công cao: Cung cấp khả năng sẵn có dịch vụ lên tới 99,995% (SLA).
Cách sử dụng Deep SerpAPI playground để thu thập thông tin khách sạn Google
Deep SerpAPI cung cấp một công cụ trực tuyến mạnh mẽ, Playground, cho phép các nhà phát triển nhanh chóng thu thập thông tin khách sạn Google mà không cần viết mã. Playground là một giao diện trực quan có thể lấy dữ liệu kết quả tìm kiếm có cấu trúc thông qua các cài đặt tham số và thao tác nhấp đơn giản. Sau đây là các bước chi tiết để sử dụng Deep SerpAPI Playground để thu thập thông tin khách sạn Google.
Cách lấy API KEY của Deep SerpAPI:
- Sau khi đăng ký miễn phí trên Scrapeless, bạn sẽ nhận được 20.000 truy vấn tìm kiếm miễn phí.
- Điều hướng đến Quản lý khóa API. Sau đó nhấp vào Tạo để tạo khóa API duy nhất. Sau khi tạo, chỉ cần nhấp vào AP để sao chép nó.

1. Đăng ký và truy cập Playground
- Tạo tài khoản: Nếu chưa có, hãy đăng ký tài khoản Deep SerpAPI.
- Truy cập Deep SerpApi Playground: Sau khi đăng nhập, hãy điều hướng đến phần "Deep SerpApi".

2. Đặt thông số tìm kiếm
- Trong Playground, hãy nhập từ khóa tìm kiếm của bạn, chẳng hạn như "khách sạn New York".
- Đặt các thông số khác, chẳng hạn như ngày nhận phòng, ngày trả phòng, quốc gia, ngôn ngữ, v.v.

Bạn cũng có thể nhấp để xem tài liệu API chính thức của Scrapeless để tìm hiểu về các tham số của Khách sạn Google.
3. Thực hiện tìm kiếm
- Nhấp vào nút "Bắt đầu tìm kiếm", và Playground sẽ gửi yêu cầu đến Deep Serp API và trả về dữ liệu JSON có cấu trúc.
- Dữ liệu được trả về sẽ bao gồm tên khách sạn, chi tiết thương hiệu, thông tin giá cả, mô tả, xếp hạng, tiện nghi, vị trí gần đó, xếp hạng khách sạn, v.v.

4. Xem và xuất dữ liệu
- Duyệt qua dữ liệu JSON được trả về để xem thông tin chi tiết cho từng khách sạn.
- Nếu cần, bạn có thể nhấp vào "Xuất" ở góc trên bên phải để xuất dữ liệu sang định dạng CSV hoặc JSON để phân tích thêm.
5. Tích hợp vào dự án của bạn
- Nếu bạn cần tích hợp dữ liệu vào ứng dụng của mình, Deep SerpAPI cung cấp hỗ trợ thư viện cho nhiều ngôn ngữ lập trình, bao gồm Python, JavaScript, Ruby, PHP, Java, C#, C++, Swift, Go và Rust.
Mã ví dụ (Python)
import json
import requests
class Payload:
def __init__(self, actor, input_data):
self.actor = actor
self.input = input_data
def send_request():
host = "api.scrapeless.com"
url = f"https://{host}/api/v1/scraper/request"
token = "your_token"
headers = {
"x-api-token": token
}
input_data = {
"engine": "google_hotel",
q: query,
engine: 'google',
gl: 'us',
hl: 'en'
}
payload = Payload("scraper.google.hotel", input_data)
json_payload = json.dumps(payload.__dict__)
response = requests.post(url, headers=headers, data=json_payload)
if response.status_code != 200:
print("Error:", response.status_code, response.text)
return
print("body", response.text)
if __name__ == "__main__":
send_request()
Kế hoạch giá Deep SerpAPI: Phù hợp và mạnh mẽ
Deep SerpAPI cung cấp một giải pháp tiết kiệm chi phí để giúp các nhà phát triển nhanh chóng có được dữ liệu trang kết quả tìm kiếm của Google (SERP). Kế hoạch giá của nó rất cạnh tranh, với giá thấp tới 0,1 đô la cho 1.000 truy vấn, áp dụng cho hơn 20 kịch bản kết quả tìm kiếm của Google.
Chương trình hỗ trợ nhà phát triển miễn phí
Deep SerpAPI hiện cũng cung cấp chương trình hỗ trợ nhà phát triển miễn phí để giúp các nhà phát triển tích hợp và sử dụng API của mình tốt hơn. Dưới đây là chi tiết của chương trình:
- Hỗ trợ tích hợp: Tích hợp Deep SerpAPI vào các công cụ AI, ứng dụng hoặc dự án của bạn. Chúng tôi đã hỗ trợ Dify và sẽ sớm hỗ trợ Langchain, Langflow, FlowiseAI và các framework khác.
- Thời gian hỗ trợ miễn phí: Sau khi tích hợp, các nhà phát triển có thể nhận được 1-12 tháng hỗ trợ nhà phát triển miễn phí bằng cách chia sẻ kết quả của bạn trên GitHub hoặc mạng xã hội.
- Hạn ngạch sử dụng: Lên tới 500k lượt sử dụng mỗi tháng, giúp các nhà phát triển không phải lo lắng về vấn đề chi phí trong giai đoạn đầu của dự án.

Bạn có thể tham gia Discord để liên hệ với Liam để tìm hiểu về việc tham gia sự kiện
Kết luận
Tóm lại, việc thu thập dữ liệu giá khách sạn Google bằng Node.js có thể là một phương pháp có giá trị để thu thập dữ liệu giá cả, nhưng nó đi kèm với những thách thức như xử lý nội dung động và tránh bị phát hiện. Mặc dù các công cụ như Puppeteer hoặc Playwright có thể giúp ích, nhưng chúng yêu cầu bảo trì liên tục và chuyên môn kỹ thuật. Để hợp lý hóa quy trình, chúng tôi khuyên bạn nên sử dụng Scrapeless, cung cấp giải pháp không cần mã, không rắc rối để trích xuất dữ liệu giá khách sạn một cách hiệu quả và đáng tin cậy. Với Scrapeless, bạn có thể tập trung vào thông tin chi tiết hơn là sự phức tạp của việc thu thập dữ liệu web. Hãy thử ngay hôm nay và đơn giản hóa việc thu thập dữ liệu của bạn!
Tài nguyên bổ sung
Cách thu thập dữ liệu Google News bằng Python
Cách sử dụng Selenium với PowerShell
Thu thập dữ liệu chi tiết sản phẩm từ Google Shopping bằng Scrapeless
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.