Skip to main content gottem  — one API for every scraper.
Travel
Verified

Google Hotels Scraper

Extract hotel comparison data, pricing across providers, and availability from Google Hotels aggregated search results. Built on spider-browser .

Get started Docs
target
google.com/travel/hotels
success rate
99.9%
latency
~4ms
Quick start

Extract data in minutes.

google-hotels-scraper.ts
import { SpiderBrowser } from "spider-browser";

const spider = new SpiderBrowser({
  apiKey: process.env.SPIDER_API_KEY!,
  stealth: 2,
});

await spider.connect();
const page = spider.page!;
await page.goto("https://www.google.com/travel/hotels/London?q=hotels+in+london&g2lb=2502548&hl=en&gl=us&cs=1&ssta=1&ts=CAESCgoCCAMKAggDEAAaRwopEicyJTB4NDg3NjA0ZGVhZjIyMWU5YjoweDEzZDRhMTM4MTc2NmQxMTQSGhIUCgcI6A8QBhgTEgcI6A8QBhgUGAEyAhAAKgsKBygBOgNHQlAaAA");
await page.content(15000);

const data = await page.evaluate(`(() => {
  const hotels = [];
  document.querySelectorAll("[data-ved]").forEach(el => {
    const name = el.querySelector("h2, h3, [role='heading']")?.textContent?.trim();
    const price = [...(el.querySelectorAll("span") || [])].find(s => /$[d,]+/.test(s.textContent || ""))?.textContent?.trim();
    const rating = el.querySelector("[aria-label*='star'], [aria-label*='rating']")?.getAttribute("aria-label") || el.querySelector("[aria-label*='star']")?.textContent?.trim();
    const reviews = [...(el.querySelectorAll("span") || [])].find(s => /[d,]+s*review/i.test(s.textContent || ""))?.textContent?.trim();
    if (name) hotels.push({ name, price, rating, reviews });
  });
  return JSON.stringify({ total: hotels.length, hotels: hotels.slice(0, 10) });
})()`);

console.log(JSON.parse(data));
await spider.close();
ready to run · spider-browser · TypeScript
Fetch API

One endpoint for google.com/travel/hotels.

Structured JSON from google.com/travel/hotels with a single POST. AI-resolved selectors, cached on the first call.

POST /fetch/google.com/
Hotel namePriceRatingReview countProviderLocation
cURL
curl -X POST https://api.spider.cloud/fetch/google.com/ \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"return_format": "json"}'
Python
import requests

resp = requests.post(
    "https://api.spider.cloud/fetch/google.com/",
    headers={
        "Authorization": "Bearer YOUR_API_KEY",
        "Content-Type": "application/json",
    },
    json={"return_format": "json"},
)
print(resp.json())
Node.js
const resp = await fetch("https://api.spider.cloud/fetch/google.com/", {
  method: "POST",
  headers: {
    "Authorization": "Bearer YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ return_format: "json" }),
});
const data = await resp.json();
console.log(data);
Extraction

Fields you can pull.

Hotel namePriceRatingReview countProviderLocationStar ratingAmenities
Pricing

Dynamic rate capture

Session-aware scraping captures pricing on google.com/travel/hotels that changes per visitor.

Rendering

Complex SPA handling

Full browser rendering for React/Next.js booking interfaces and search results.

Scale

Destination coverage

Scrape listings across thousands of destinations and date ranges concurrently.

Related

More Travel scrapers.

Start

Start scraping google.com/travel/hotels.

Grab an API key and call the endpoint above. The first request resolves the config; every request after hits cache.