Shopping Search
The google_shopping_search
source is designed to retrieve Google Shopping search results.
Request samples
In this example, we make a request to retrieve the first 4
pages of Google Shopping search for the search term adidas
, sorted by descending price and minimum price of $20
.
curl 'https://realtime.oxylabs.io/v1/queries' \
--user 'USERNAME:PASSWORD' \
-H 'Content-Type: application/json' \
-d '{
"source": "google_shopping_search",
"domain": "com",
"query": "adidas",
"pages": 4,
"parse": true,
"context": [
{
"key": "sort_by",
"value": "pd"
},
{
"key": "min_price",
"value": 20
}
]
}'
import requests
from pprint import pprint
# Structure payload.
payload = {
'source': 'google_shopping_search',
'domain': 'com',
'query': 'adidas',
'pages': 4,
'parse': True,
'context': [
{'key': 'sort_by', 'value': 'pd'},
{'key': 'min_price', 'value': 20},
],
}
# 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_shopping_search",
domain: "com",
query: "adidas",
pages: 4,
parse: true,
context: [
{
key: "sort_by",
value: "pd"
},
{
key: "min_price",
value: 20
},
],
};
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_shopping_search&domain=com&query=adidas&pages=4&parse=true&context[0][key]=sort_by&context[0][value]=pd&context[1][key]=min_price&context[1][value]=20&access_token=12345abcde
<?php
$params = array(
'source' => 'google_shopping_search',
'domain' => 'com',
'query' => 'adidas',
'pages' => 4,
'parse' => true,
'context' => [
['key' => 'sort_by', 'value' => 'pd'],
['key' => 'min_price', 'value' => 20]
]
);
$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_shopping_search",
"domain": "com",
"query": "adidas",
"pages": 4,
"parse": true,
"context": []map[string]interface{}{
{"key": "sort_by", "value": "pd"},
{"key": "min_price", "value": 20},
},
}
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_shopping_search",
domain = "com",
query = "adidas",
pages = 4,
parse = true,
context = new dynamic [] {
new { key = "sort_by", value = "pd" },
new { key = "min_price", value = "20" }
}
};
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_shopping_search");
jsonObject.put("domain", "com");
jsonObject.put("query", "adidas");
jsonObject.put("pages", 4);
jsonObject.put("parse", true);
jsonObject.put("context", new JSONArray()
.put(new JSONObject()
.put("key", "sort_by")
.put("value", "pd"))
.put(new JSONObject()
.put("key", "min_price")
.put("value", 20))
);
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_shopping_search",
"domain": "com",
"query": "adidas",
"pages": 4,
"parse": true,
"context": [
{
"key": "sort_by",
"value": "pd"
},
{
"key": "min_price",
"value": 20
}
]
}
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 Shopping search results.
- mandatory parameter
Localization
Adapt results to specific geographical locations, domains, and languages.
Pagination
Controls for managing the pagination and retrieval of search results.
Filtering
Advanced options for tailoring and refining the search context.
Other
Additional advanced settings and controls for specialized requirements.
Structured data
Below you can find a structured output example for google_shopping_search
.
Output data dictionary
HTML example
JSON structure
The table below presents a detailed list of each search page element we parse, along with its description and data type. The table also includes some metadata.
In the following sections, parsed JSON code snippets are shortened where more than one item for the result type is available.
Paid Listing Ads
An array of objects containing Product Listing Ads (PLA) for the product.
...
"pla": [
{
"items": [
{
"pos": 1,
"url": "/aclk?sa=l&ai=DChcSEwiY8fLUi9OGAxVtj1AGHYnVBj0YABABGgJkZw&gclid=EAIaIQobChMImPHy1IvThgMVbY9QBh2J1QY9EAQYASABEgKpS_D_BwE&sig=AOD64_2DguiyFTR4GRY6Ww9o__l9HgJC_A&ctype=5&q=&ved=0ahUKEwj-6ezUi9OGAxWiWUEAHdbxAgsQww8I2xA&adurl=",
"price": "$2,199.00",
"title": "Polycade Sente: Black",
"seller": "Polycade",
"thumbnail": "https://encrypted-tbn0.gstatic.com/shopping?q=tbn:ANd9GcS59ZNOrZH96cy_cOgzxL52VoJYq9iPl7q8g26f9odcuG8pY8ZRxe9YMhkZDPnFAZDyP04lu29gy57ObwsKpWHb_pzQBja34tkErnSAz3nw&usqp=CAE"
},
{
"pos": 2,
"url": "/aclk?sa=l&ai=DChcSEwiY8fLUi9OGAxVtj1AGHYnVBj0YABADGgJkZw&gclid=EAIaIQobChMImPHy1IvThgMVbY9QBh2J1QY9EAQYAiABEgJwHvD_BwE&sig=AOD64_0LFB8jrHwNdEkmOdjcjGOdhQ9ZVg&ctype=5&q=&ved=0ahUKEwj-6ezUi9OGAxWiWUEAHdbxAgsQww8I3hA&adurl=",
"price": "$2,199.00",
"title": "Polycade Sente: White",
"seller": "Polycade",
"thumbnail": "https://encrypted-tbn2.gstatic.com/shopping?q=tbn:ANd9GcQ2onFg_aXbg8LTX3qJT9f9XdiFrl_SNLXlpKhSjCQQ2c5EmQcrNXPwCMphjugJUhWctBpRVC0BiS4OUnq0FRAeQ4BXEWI6FuvZvGERsLc&usqp=CAE"
},
...
],
"pos_overall": 1
}
],
...
Filters
...
"filters": [
{
"name": "Show only",
"values": [
{
"url": "/search?sca_esv=bbd3241cb3940ce2&sca_upv=1&gl=us&hl=en&tbm=shop&q=adidas&tbs=mr:1,sales:1&sa=X&ved=0ahUKEwikoMX_iNOGAxVvFbkGHV6uDZcQ7KEGCJ4WKAA",
"value": "On sale"
}
]
},
{
"name": "Price",
"values": [
{
"url": "/search?sca_esv=bbd3241cb3940ce2&sca_upv=1&gl=us&hl=en&tbm=shop&q=adidas&tbs=mr:1,price:1,ppr_max:40&sa=X&ved=0ahUKEwikoMX_iNOGAxVvFbkGHV6uDZcQvSsIohYoAA",
"value": "Up to $40"
},
...
{
"url": "/search?sca_esv=bbd3241cb3940ce2&sca_upv=1&gl=us&hl=en&tbm=shop&q=adidas&tbs=mr:1,price:1,ppr_min:90&sa=X&ved=0ahUKEwikoMX_iNOGAxVvFbkGHV6uDZcQvSsIpRYoAw",
"value": "Over $90"
}
]
},
{
"name": "Color",
"values": [
{
"url": "/search?sca_esv=bbd3241cb3940ce2&sca_upv=1&gl=us&hl=en&tbm=shop&q=adidas&tbs=mr:1,color:specific,color_val:black&sa=X&ved=0ahUKEwikoMX_iNOGAxVvFbkGHV6uDZcQtSsIrBYoAA",
"value": "Black"
},
...
{
"url": "/search?sca_esv=bbd3241cb3940ce2&sca_upv=1&gl=us&hl=en&tbm=shop&q=adidas&tbs=mr:1,color:specific,color_val:pink&sa=X&ved=0ahUKEwikoMX_iNOGAxVvFbkGHV6uDZcQtSsIshYoBg",
"value": "Pink"
}
]
},
...
]
Organic
An array of objects containing details of organic search results.
...
"organic": [
{
"pos": 1,
"url": "/shopping/product/1503163696221055935?q=adidas&uule=w+CAIQICINdW5pdGVkIHN0YXRlcw&gl=us&hl=en&prds=eto:9260750834573489043_0,pid:17425630667348523786,rsk:PC_12455715925962143981&sa=X&ved=0ahUKEwikoMX_iNOGAxVvFbkGHV6uDZcQ8gIInBgoAA",
"type": "grid",
"price": 100,
"title": "Adidas Samba OG 'White Black' 9",
"rating": 4.7,
"currency": "USD",
"delivery": "Delivery by Tue, Jun 18 \u00b7 Free 30-day returns",
"merchant": {
"url": "/url?url=https://www.adidas.com/us/samba-og-shoes/B75806.html&rct=j&q=&esrc=s&opi=95576897&sa=U&ved=0ahUKEwikoMX_iNOGAxVvFbkGHV6uDZcQguUECKIY&usg=AOvVaw1uGHW41BiuoKTfeYo2le3u",
"name": "adidas"
},
"price_str": "$100.00",
"thumbnail": "https://encrypted-tbn2.gstatic.com/shopping?q=tbn:ANd9GcSEQPCgQtOW8Swse-SyzsEBKqqzGJO_l9lcKaq7hIeSPfLqrBv5sKJiligHh3eUZ7XoWnvwJfL2&usqp=CAE",
"product_id": "1503163696221055935",
"pos_overall": 1,
"reviews_count": 5028
},
]
...
Last updated