Travel: Hotels
The google_travel_hotels
data source is designed to retrieve Google Travel service's hotel search results.
To ensure optimal utilization of this service, include the "render": "html"
parameter in your request.
Request samples
In this example, we make a request to retrieve the 2
nd results page for hotel availability for 2
adult guests between 2023-10-01
and 2023-10-10
for 2
to 4
-star hotels in Paris from google.com
.
curl 'https://realtime.oxylabs.io/v1/queries' \
--user 'USERNAME:PASSWORD' \
-H 'Content-Type: application/json' \
-d '{
"source": "google_travel_hotels",
"domain": "com",
"start_page": 2,
"query": "hotels in Paris",
"render": "html",
"context": [
{"key": "adults", "value": 2},
{"key": "hotel_dates", "value": "2023-10-01,2023-10-10"},
{"key": "hotel_classes", "value": [2, 3, 4]}
]
}'
import requests
from pprint import pprint
# Structure payload.
payload = {
'source': 'google_travel_hotels',
'domain': 'com',
'query': 'hotels in Paris',
'start_page': 2,
'render': 'html',
'context': [
{'key': 'adults', 'value': 1},
{'key': 'hotel_dates', 'value': '2023-10-01,2023-10-10'},
{'key': 'hotel_classes', 'value': [2,3,4]},
],
}
# Get response.
response = requests.request(
'POST',
'https://realtime.oxylabs.io/v1/queries',
auth=('USERNAME', 'PASSWORD'),
json=payload,
)
# Print prettified response to stdout.
pprint(response.json())
const https = require("https");
const username = "USERNAME";
const password = "PASSWORD";
const body = {
source: "google_travel_hotels",
domain: "com",
start_page: 2,
query: "hotels in Paris",
render: "html",
context: [
{ key: "adults", value: 2 },
{ key: "hotel_dates", value: "2023-10-01,2023-10-10" },
{ key: "hotel_classes", value: [2, 3, 4] },
],
};
const options = {
hostname: "realtime.oxylabs.io",
path: "/v1/queries",
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization:
"Basic " + Buffer.from(`${username}:${password}`).toString("base64"),
},
};
const request = https.request(options, (response) => {
let data = "";
response.on("data", (chunk) => {
data += chunk;
});
response.on("end", () => {
const responseData = JSON.parse(data);
console.log(JSON.stringify(responseData, null, 2));
});
});
request.on("error", (error) => {
console.error("Error:", error);
});
request.write(JSON.stringify(body));
request.end();
https://realtime.oxylabs.io/v1/queries?source=google_travel_hotels&domain=com&query=hotels+in+Paris&start_page=3&render=html&context[0][key]=adults&context[0][value]=1&context[1][key]=hotel_dates&context[1][value]=2023-10-01,2023-10-10&context[2][key]=hotel_classes&context[2][value]=[2,3,4]&access_token=12345abcde
<?php
$params = array(
'source' => 'google_travel_hotels',
'domain' => 'com',
'start_page' => 2,
'query' => 'hotels in Paris',
'render' => 'html',
'context' => [
['key' => 'adults', 'value' => 2],
['key' => 'hotel_dates', 'value' => '2023-10-01,2023-10-10'],
['key' => 'hotel_classes', 'value' => [2, 3, 4]]
]
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://realtime.oxylabs.io/v1/queries");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_USERPWD, "USERNAME" . ":" . "PASSWORD");
$headers = array();
$headers[] = "Content-Type: application/json";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
echo $result;
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close($ch);
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
func main() {
const Username = "USERNAME"
const Password = "PASSWORD"
payload := map[string]interface{}{
"source": "google_travel_hotels",
"domain": "com",
"start_page": 2,
"query": "hotels in Paris",
"render": "html",
"context": []map[string]interface{}{
{"key": "adults", "value": 2},
{"key": "hotel_dates", "value": "2023-10-01,2023-10-10"},
{"key": "hotel_classes", "value": []interface{}{2, 3, 4}},
},
}
jsonValue, _ := json.Marshal(payload)
client := &http.Client{}
request, _ := http.NewRequest("POST",
"https://realtime.oxylabs.io/v1/queries",
bytes.NewBuffer(jsonValue),
)
request.SetBasicAuth(Username, Password)
response, _ := client.Do(request)
responseText, _ := ioutil.ReadAll(response.Body)
fmt.Println(string(responseText))
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Json;
using System.Threading.Tasks;
namespace OxyApi
{
class Program
{
static async Task Main()
{
const string Username = "USERNAME";
const string Password = "PASSWORD";
var parameters = new {
source = "google_travel_hotels",
domain = "com",
start_page = 2,
query = "hotels in Paris",
render = "html",
context = new dynamic [] {
new { key = "adults", value = 2 },
new { key = "hotel_dates", value = "2023-10-01,2023-10-10" },
new { key = "hotel_classes", value = new int [] {2, 3, 4} }
}
};
var client = new HttpClient();
Uri baseUri = new Uri("https://realtime.oxylabs.io");
client.BaseAddress = baseUri;
var requestMessage = new HttpRequestMessage(HttpMethod.Post, "/v1/queries");
requestMessage.Content = JsonContent.Create(parameters);
var authenticationString = $"{Username}:{Password}";
var base64EncodedAuthenticationString = Convert.ToBase64String(System.Text.ASCIIEncoding.UTF8.GetBytes(authenticationString));
requestMessage.Headers.Add("Authorization", "Basic " + base64EncodedAuthenticationString);
var response = await client.SendAsync(requestMessage);
var contents = await response.Content.ReadAsStringAsync();
Console.WriteLine(contents);
}
}
}
package org.example;
import okhttp3.*;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.concurrent.TimeUnit;
public class Main implements Runnable {
private static final String AUTHORIZATION_HEADER = "Authorization";
public static final String USERNAME = "USERNAME";
public static final String PASSWORD = "PASSWORD";
public void run() {
JSONObject jsonObject = new JSONObject();
jsonObject.put("source", "google_travel_hotels");
jsonObject.put("domain", "com");
jsonObject.put("start_page", 2);
jsonObject.put("query", "hotels in Paris");
jsonObject.put("render", "html");
jsonObject.put("context", new JSONArray()
.put(new JSONObject().put("key", "adults").put("value", 2))
.put(new JSONObject().put("key", "hotel_dates").put("value", "2023-10-01,2023-10-10"))
.put(new JSONObject().put("key", "hotel_classes").put("value", new JSONArray().put(2).put(3).put(4)))
);
Authenticator authenticator = (route, response) -> {
String credential = Credentials.basic(USERNAME, PASSWORD);
return response
.request()
.newBuilder()
.header(AUTHORIZATION_HEADER, credential)
.build();
};
var client = new OkHttpClient.Builder()
.authenticator(authenticator)
.readTimeout(180, TimeUnit.SECONDS)
.build();
var mediaType = MediaType.parse("application/json; charset=utf-8");
var body = RequestBody.create(jsonObject.toString(), mediaType);
var request = new Request.Builder()
.url("https://realtime.oxylabs.io/v1/queries")
.post(body)
.build();
try (var response = client.newCall(request).execute()) {
if (response.body() != null) {
try (var responseBody = response.body()) {
System.out.println(responseBody.string());
}
}
} catch (Exception exception) {
System.out.println("Error: " + exception.getMessage());
}
System.exit(0);
}
public static void main(String[] args) {
new Thread(new Main()).start();
}
}
{
"source": "google_travel_hotels",
"domain": "com",
"start_page": 2,
"query": "hotels in Paris",
"render": "html",
"context": [
{
"key": "adults",
"value": 2
},
{
"key": "hotel_dates",
"value": "2023-10-01,2023-10-10"
},
{
"key": "hotel_classes",
"value": [2,3,4]
}
]
}
We use synchronous Realtime integration method in our examples. If you would like to use Proxy Endpoint or asynchronous Push-Pull integration, refer to the integration methods section.
Request parameter values
Generic
Basic setup and customization options for scraping Google Travel: Hotels results.
- mandatory parameter
Localization
Adapt search results to specific geographical locations, domains, and languages.
NOTE: "geo_location": "United States"
and other wide-area locations are not supported. Use city-level geo_location
, e.g., Seattle,Washington,United States
Pagination
Controls for managing the pagination.
Filtering
Advanced options for tailoring and refining the search context.
Output example
{
"results": [
{
"content":"<!doctype html>\n<html lang=\"en\">\n<head>
...
</script></body>\n</html>\n",
"created_at": "2024-02-13 11:30:09",
"updated_at": "2024-02-13 11:30:36",
"page": 2,
"url": "https://www.google.com/travel/search?q=hotels%20in%20Paris&qs=OAA&hrf=OAI4AzgEWAGSAQIgAbABAA&ap=EgNDQXcwAGgA&ts=CAEaFhIUEhIKBwjnDxAKGAESBwjnDxAKGAo&uule=w%20CAIQICINdW5pdGVkIHN0YXRlcw&gl=us&hl=en&ved=0CAAQ5JsGahcKEwjIwci_m6iEAxUAAAAAHQAAAAAQew",
"job_id": "7163132237108506625",
"status_code": 200
}
]
}
Last updated