# Fonte Universal

Raspe outros sites (Home Depot, Idealo, Zillow, [**Yandex**](https://developers.oxylabs.io/documentation/pt-br/guias-para-scraper-apis/forming-urls#yandex), [**Baidu**](https://developers.oxylabs.io/documentation/pt-br/guias-para-scraper-apis/forming-urls#baidu), etc.) com nossa `universal` fonte. Aceita URLs junto com [**parâmetros adicionais**](#additional).

## Exemplos de requisição

Neste exemplo, a API irá recuperar uma página de produto de e-commerce.

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

```shell
curl 'https://realtime.oxylabs.io/v1/queries' \
--user 'USERNAME:PASSWORD' \
-H 'Content-Type: application/json' \
-d '{
        "source": "universal",
        "url": "https://sandbox.oxylabs.io/products/1"
    }'
```

{% endtab %}

{% tab title="Python" %}

```python
import requests
from pprint import pprint


# Estruturar payload.
payload = {
    'source': 'universal',
    'url': 'https://sandbox.oxylabs.io/products/1',
}

# Obter resposta.
response = requests.request(
    'POST',
    'https://realtime.oxylabs.io/v1/queries',
    auth=('USERNAME', 'PASSWORD'),
    json=payload,
)

# Em vez de resposta com status do job e URL dos resultados, isto retornará o
# resposta JSON com o resultado.
pprint(response.json())
```

{% endtab %}

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

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

const username = "USERNAME";
const password = "PASSWORD";
const body = {
    source: "universal",
    url: "https://sandbox.oxylabs.io/products/1",
};

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
# A string inteira que você enviar precisa estar codificada em URL.

https://realtime.oxylabs.io/v1/queries?source=universal&url=https%3A%2F%2Fsandbox.oxylabs.io%2Fproducts%2F1&access_token=12345abcde
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$params = array(
    'source' => 'universal',
    'url' => 'https://sandbox.oxylabs.io/products/1',
);

$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": "universal",
		"url":    "https://sandbox.oxylabs.io/products/1",
	}

	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 = "universal",
                url = "https://sandbox.oxylabs.io/products/1"
            };

            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", "universal");
        jsonObject.put("url", "https://sandbox.oxylabs.io/products/1");

        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": "universal", 
    "url": "https://sandbox.oxylabs.io/products/1"
}
```

{% endtab %}
{% endtabs %}

<details>

<summary>Exemplo de saída</summary>

```json
{
    "results": [
        {
            "content": "<!DOCTYPE html><html lang=\"en\">
            CONTEÚDO
            </html>",
            "created_at": "2024-07-01 11:35:14",
            "updated_at": "2024-07-01 11:35:15",
            "page": 1,
            "url": "https://sandbox.oxylabs.io/products/1",
            "job_id": "7213505428280329217",
            "status_code": 200
        }
    ]
}
```

</details>

Usamos o método de integração síncrono [**Realtime**](https://developers.oxylabs.io/documentation/pt-br/solucoes-de-scraping/web-scraper-api/integration-methods/realtime) em nossos exemplos. Se você quiser usar [**Proxy Endpoint**](https://developers.oxylabs.io/documentation/pt-br/solucoes-de-scraping/web-scraper-api/integration-methods/proxy-endpoint) ou integração assíncrona [**integração Push-Pull, consulte a**](https://developers.oxylabs.io/documentation/pt-br/solucoes-de-scraping/web-scraper-api/integration-methods/push-pull) seção [**métodos de integração**](https://developers.oxylabs.io/documentation/pt-br/solucoes-de-scraping/web-scraper-api/integration-methods) .

## Valores dos parâmetros de requisição

### Genérico

<table><thead><tr><th width="205">Parâmetro</th><th width="289.3333333333333">Descrição</th><th>Valor Padrão</th></tr></thead><tbody><tr><td><mark style="background-color:green;"><strong>source</strong></mark></td><td>Define o scraper.</td><td><code>universal</code></td></tr><tr><td><mark style="background-color:green;"><strong>url</strong></mark></td><td>URL direta (link) para qualquer página.</td><td>-</td></tr><tr><td><code>callback_url</code></td><td>URL do seu endpoint de callback. <a href="../../integration-methods/push-pull#callback"><strong>Mais informações</strong></a>.</td><td>-</td></tr></tbody></table>

&#x20;    \- parâmetro obrigatório

### Adicionais

Estes são os parâmetros das nossas [**funcionalidades**](https://developers.oxylabs.io/documentation/pt-br/solucoes-de-scraping/web-scraper-api/features).

<table><thead><tr><th width="253">Parâmetro</th><th width="338.92746113989637">Descrição</th><th>Valor Padrão</th></tr></thead><tbody><tr><td><code>geo_location</code></td><td>Define a localização geográfica do proxy para recuperar dados. Encontre locais suportados <a href="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiwDdoZGfMbUe5cRL2417%2Fuploads%2FxoQb19qSyodB2D4no0DZ%2FList%20of%20supported%20geo_location%20values_sapi.json?alt=media&#x26;token=d2e2df7b-10ba-4399-a547-0c4a99e62293"><strong>aqui</strong></a>.</td><td>-</td></tr><tr><td><code>render</code></td><td>Habilita renderização de JavaScript quando definido como <code>html</code>. <a href="../features/js-rendering-and-browser-control/javascript-rendering"><strong>Mais informações</strong></a><strong>.</strong> OBSERVAÇÃO: Se você observar taxas de sucesso baixas ou recuperar conteúdo vazio, por favor tente adicionar este parâmetro.</td><td>-</td></tr><tr><td><code>browser_instructions</code></td><td>Defina suas próprias instruções de navegador que serão executadas ao renderizar JavaScript. <a href="../features/js-rendering-and-browser-control/browser-instructions"><strong>Mais informações</strong></a>.</td><td>-</td></tr><tr><td><code>parse</code></td><td>Retorna dados parseados quando definido como <code>true</code>, desde que exista um parser dedicado para o tipo de página da URL submetida.</td><td><code>false</code></td></tr><tr><td><code>parsing_instructions</code></td><td>Defina sua própria lógica de parsing e transformação de dados que será executada sobre o resultado do scraping HTML. Leia mais: <a href="../features/custom-parser/writing-instructions-manually/parsing-instruction-examples"><strong>Exemplos de instruções de parsing</strong></a><strong>.</strong></td><td>-</td></tr><tr><td><code>context</code>:<br><code>headers</code></td><td>Passe seus próprios headers. Saiba mais<a href="../features/http-context-and-job-management/headers-cookies-method"> <strong>aqui</strong></a>.</td><td>-</td></tr><tr><td><code>context</code>:<br><code>cookies</code></td><td>Passe seus próprios cookies. Saiba mais <a href="../../features/http-context-and-job-management/headers-cookies-method#custom-cookies"><strong>aqui</strong></a>.</td><td>-</td></tr><tr><td><code>context</code>:<br><code>session_id</code></td><td>Se você quiser usar o mesmo proxy com múltiplas requisições, pode fazê-lo usando este parâmetro. Apenas defina sua sessão para qualquer string que desejar, e nós atribuiremos um proxy a esse ID e o manteremos por até 10 minutos. Depois disso, se você fizer outra requisição com o mesmo session ID, um novo proxy será atribuído a esse ID de sessão.</td><td>-</td></tr><tr><td><code>context</code>:<br><code>http_method</code></td><td>Defina como <code>post</code> se você quiser fazer um <code>POST</code> request para sua URL alvo via E-commerce Scraper API. Saiba mais <a href="../../features/http-context-and-job-management/headers-cookies-method#http-method"><strong>aqui</strong></a>.</td><td><code>get</code></td></tr><tr><td><code>user_agent_type</code></td><td>Tipo de dispositivo e navegador. A lista completa pode ser encontrada <a href="../features/http-context-and-job-management/user-agent-type"><strong>aqui</strong>.</a></td><td><code>desktop</code></td></tr><tr><td><code>context</code>:<br><code>content</code></td><td>Codificado em Base64 <code>POST</code> corpo da requisição. Só é útil se <code>http_method</code> estiver definido como <code>post</code>.</td><td>-</td></tr><tr><td><code>content_encoding</code></td><td>Adicione este parâmetro se você estiver baixando imagens. Saiba mais <a href="../features/result-processing-and-storage/output-types/download-images"><strong>aqui</strong></a>.</td><td><code>base64</code></td></tr><tr><td><code>context</code>:<br><code>follow_redirects</code></td><td>Defina como <code>true</code> para habilitar que o scraper siga redirecionamentos. Por padrão, redirecionamentos são seguidos até um limite de 10 links, tratando toda a cadeia como um único job de scraping.</td><td><code>true</code></td></tr><tr><td><code>context</code>:<br><code>successful_status_codes</code></td><td>Defina um código de resposta HTTP personalizado (ou alguns deles), sobre o qual devemos considerar o scrape bem-sucedido e retornar o conteúdo para você. Pode ser útil se você quiser que retornemos a página de erro 503 ou em alguns outros casos não padrão.</td><td>-</td></tr></tbody></table>

**Todos os parâmetros**

Neste exemplo, todos os parâmetros disponíveis estão incluídos (embora nem sempre necessários ou compatíveis na mesma requisição), para lhe dar uma ideia de como formatar suas requisições.

{% code fullWidth="false" %}

```json
{
    "source": "universal", 
    "url": "https://example.com", 
    "user_agent_type": "desktop",
    "geo_location": "United States",
    "parse": true,
    "context": [
        {
            "key": "headers", 
            "value": {
                "Content-Type": "application/octet-stream", 
                "Custom-Header-Name": "custom header content"
            }
        }, 
        {
            "key": "cookies", 
            "value": [
                {
                    "key": "NID", 
                    "value": "1234567890"
                },
                {
                    "key": "1P JAR",
                    "value": "0987654321"
                }]
        },
        {
            "key": "follow_redirects",
            "value": true
        },
        {
            "key": "http_method", "value": "get"
        },
        {
            "key": "content",
            "value": "YmFzZTY0RW5jb2RlZFBPU1RCb2R5"
        },
        {
            "key": "successful_status_codes",
            "value": [808, 909]
        }]
}
```

{% endcode %}
