# URL

Puede obtener resultados de Kroger proporcionando sus propias URL a nuestro servicio. Podemos devolver el HTML de cualquier página de Kroger que desee.

## Solicitar muestras

El ejemplo siguiente demuestra cómo recuperar una página de resultados de búsqueda de Kroger basada en una consulta de producto específica, rango de precios y ubicación de la tienda.

{% tabs %}
{% tab title="cURL" %}

```shell
curl 'https://realtime.oxylabs.io/v1/queries' \
--user 'USERNAME:PASSWORD' \
-H 'Content-Type: application/json' \
-d '{
        "source": "kroger",
        "url": "https://www.kroger.com/search?query=adidas&price=10.00-15.00",
        "store_id": "01100002"
    }'

```

{% endtab %}

{% tab title="Python" %}

```python
import requests
from pprint import pprint

# Structure payload.
payload = {
    "source": "kroger",
    "url": "https://www.kroger.com/search?query=adidas&price=10.00-15.00",
    "store_id": "01100002",
}

# 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())
```

{% endtab %}

{% tab title="Node.js" %}

```javascript
const https = require("https");

const username = "USERNAME";
const password = "PASSWORD";
const body = {
    source: "kroger",
    url: "https://www.kroger.com/search?query=adidas&price=10.00-15.00",
    store_id: "01100002",
};

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();
```

{% endtab %}

{% tab title="HTTP" %}

```http
https://realtime.oxylabs.io/v1/queries?source=kroger&url=https%3A%2F%2Fwww.kroger.com%2Fsearch%3Fquery%3Dadidas%26price%3D10.00-15.00&store_id=01100002&access_token=12345abcde
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$params = array(
    "source" => "kroger",
    "url" => "https://www.kroger.com/search?query=adidas&price=10.00-15.00",
    "store_id" => "01100002",
);

$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);
?>
```

{% endtab %}

{% tab title="Golang" %}

```go
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	const Username = "USERNAME"
	const Password = "PASSWORD"

	payload := map[string]interface{}{
		"source":   "kroger",
		"url":      "https://www.kroger.com/search?query=adidas&price=10.00-15.00",
		"store_id": "01100002",
	}

	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))
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
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 = "kroger",
                url = "https://www.kroger.com/search?query=adidas&price=10.00-15.00",
                store_id = "01100002"
            };

            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);
        }
    }
}
```

{% endtab %}

{% tab title="Java" %}

```java
package org.example;

import okhttp3.*;
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", "kroger");
        jsonObject.put("url", "https://www.kroger.com/search?query=adidas&price=10.00-15.00");
        jsonObject.put("store_id", "01100002");

        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();
    }
}
```

{% endtab %}

{% tab title="JSON" %}

```json
{
    "source": "kroger",
    "url": "https://www.kroger.com/search?query=adidas&price=10.00-15.00",
    "store_id": "01100002"
}
```

{% endtab %}
{% endtabs %}

We use synchronous [**Realtime**](https://developers.oxylabs.io/documentation/es/soluciones-de-scraping/web-scraper-api/integration-methods/realtime) integration method in our examples. If you would like to use [**Proxy Endpoint**](https://developers.oxylabs.io/documentation/es/soluciones-de-scraping/web-scraper-api/integration-methods/proxy-endpoint) or asynchronous [**Push-Pull**](https://developers.oxylabs.io/documentation/es/soluciones-de-scraping/web-scraper-api/integration-methods/push-pull) integration, refer to the [**integration methods**](https://developers.oxylabs.io/documentation/es/soluciones-de-scraping/web-scraper-api/integration-methods) section.

## Request parameter values

### Generic

Basic setup and customization options for scraping Kroger marketplace.

<table><thead><tr><th width="206">Parameter</th><th width="360.3333333333333">Description</th><th>Default Value</th></tr></thead><tbody><tr><td><mark style="background-color:green;"><strong>source</strong></mark></td><td>Sets the scraper.</td><td><code>kroger</code></td></tr><tr><td><mark style="background-color:green;"><strong>url</strong></mark></td><td>Direct URL (link) to any page.</td><td>-</td></tr><tr><td><code>render</code></td><td>Enables JavaScript rendering when set to <code>html</code>. <a href="../../../features/js-rendering-and-browser-control/javascript-rendering"><strong>More info</strong></a><strong>.</strong></td><td>-</td></tr><tr><td><code>callback_url</code></td><td>URL to your callback endpoint. <a href="../../../../integration-methods/push-pull#callback"><strong>More info</strong></a>.</td><td>-</td></tr><tr><td><code>user_agent_type</code></td><td>Device type and browser. The full list can be found <a href="../../../features/http-context-and-job-management/user-agent-type"><strong>here</strong></a>.</td><td><code>desktop</code></td></tr></tbody></table>

&#x20;    \- mandatory parameter

### Localization

Customize results based on store locations, delivery areas, and preferred fulfillment methods.

<table><thead><tr><th width="210">Parameter</th><th width="172.33333333333331">Description</th><th width="153">Default Value</th><th>Dependencies</th></tr></thead><tbody><tr><td><code>store_id</code></td><td>Specify a store. See the available values <a href="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FzrXw45naRpCZ0Ku9AjY1%2Fuploads%2FAsihGe7hi5yfauUl2JIQ%2Fkroger_stores.csv?alt=media&#x26;token=40fcd869-1845-47c5-bf76-96e74cabf685"><strong>here</strong></a>. The ID must start with '0'.</td><td>-</td><td>Required when <code>fulfillment_type</code> is set to <code>pickup</code> or <code>in_store</code>.</td></tr><tr><td><code>delivery_zip</code></td><td>Specify delivery location ZIP code.</td><td>-</td><td>Required when <code>fulfillment_type</code> is set to <code>delivery</code>.</td></tr><tr><td><code>fulfillment_type</code></td><td>Specify order fulfillment method. Available values: <code>pickup</code>, <code>delivery</code>, <code>in_store</code>.</td><td><code>pickup</code> (if only <code>store_id</code> is provided)</td><td>Requires <code>store_id</code> for <code>pickup</code> and <code>in_store</code>, or <code>delivery_zip</code> for <code>delivery</code>.</td></tr></tbody></table>

**Dependecies explained:**

* `pickup` and `in_store` values use the `store_id` parameter to determine the correct store.
* `delivery` uses the `delivery_zip` parameter to specify the delivery location.
* If only `store_id` is provided, and `fulfillment_type` is not specified, the default type is `pickup`.

{% hint style="warning" %}
If the `fulfillment_type` and `store_id`/`delivery_zip` combination is invalid (unsupported by Kroger), the scraped page will return with a 404 status.
{% endhint %}
