> For the complete documentation index, see [llms.txt](https://developers.oxylabs.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://developers.oxylabs.io/api-targets/cn/shi-pin-he-she-jiao-mei-ti/youtube/youtube-search.md).

# 搜索

你可以通过提供搜索 **查询** 向 `youtube_search` 或 `youtube_search_max` 源。 &#x20;

{% hint style="info" %}
&#x20;该 `youtube_search` 源最多可检索 **20** 个搜索结果，而 `youtube_search_max` 该源最多可返回 **700** 个结果，单次响应中。&#x20;
{% endhint %}

此源还可与 `youtube_autocomplete` 一起使用以先查找搜索词：将种子词发送到 `youtube_autocomplete`，然后将返回的一个建议作为查询值传入 `youtube_search`。每个源单独调用：autocomplete 返回建议，search 返回你选择词条的视频。

### 请求示例

以下示例演示如何使用 `youtube_search` 该源用于根据搜索 **查询检索 YouTube 视频。**&#x20;

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

```bash
curl 'https://realtime.oxylabs.io/v1/queries' \\
--user 'USERNAME:PASSWORD' \\
-H 'Content-Type: application/json' \\
-d '{
        "source": "youtube_search",
        "query": "how to make a website"
    }'
```

{% endtab %}

{% tab title="Python" %}

```python
import requests
from pprint import pprint

# Structure payload.
payload = {
    'source': 'youtube_search',
    'query': 'how to make a website'
}

# Get response.
response = requests.request(
    'POST',
    'https://realtime.oxylabs.io/v1/queries',
    auth=('user', 'pass1'),
    json=payload,
)

# Print the JSON response with the result.
pprint(response.json())
```

{% endtab %}

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

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

const username = "USERNAME";
const password = "PASSWORD";
const body = {
  source: "youtube_search",
  query: "how to make a website"
};
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="PHP" %}

```php
<?php

$params = array(
    'source' => 'youtube_search',
    'query' => 'how to make a website'
);
   
$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"

	// Define the payload with the new youtube_metadata query.
	payload := map[string]interface{}{
		"source": "youtube_search",
		"query":  "how to make a website
	}

	jsonValue, err := json.Marshal(payload)
	if err != nil {
		fmt.Println("Error marshalling JSON:", err)
		return
	}

	client := &http.Client{}
	request, err := http.NewRequest("POST", "https://realtime.oxylabs.io/v1/queries", bytes.NewBuffer(jsonValue))
	if err != nil {
		fmt.Println("Error creating request:", err)
		return
	}

	request.SetBasicAuth(Username, Password)
	request.Header.Set("Content-Type", "application/json")

	response, err := client.Do(request)
	if err != nil {
		fmt.Println("Error making request:", err)
		return
	}
	defer response.Body.Close()

	responseText, err := ioutil.ReadAll(response.Body)
	if err != nil {
		fmt.Println("Error reading response:", err)
		return
	}

	fmt.Println(string(responseText))
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Net.Http;
using System.Net.Http.Json;
using System.Text;
using System.Threading.Tasks;

namespace OxyApi
{
    class Program
    {
        static async Task Main()
        {
            const string Username = "USERNAME";
            const string Password = "PASSWORD";

            var parameters = new
            {
                source = "youtube_search",
                query = "how to make a website"
            };

            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(Encoding.UTF8.GetBytes(authenticationString));
            requestMessage.Headers.Add("Authorization", "Basic " + base64EncodedAuthenticationString);

            try
            {
                var response = await client.SendAsync(requestMessage);
                response.EnsureSuccessStatusCode();

                var contents = await response.Content.ReadAsStringAsync();
                Console.WriteLine(contents);
            }
            catch (HttpRequestException e)
            {
                Console.WriteLine($"Request error: {e.Message}");
            }
        }
    }
}
```

{% 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() {
        // Construct JSON payload for youtube_search request
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("source", "youtube_search");
        jsonObject.put("query", "how to make a website");

        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": "youtube_search",
    "query": "how to make a website"
}
```

{% endtab %}
{% endtabs %}

我们在示例中使用同步 [**Realtime**](/products/cn/web-scraper-api/integration-methods/realtime.md) 集成方法。如果你想使用  [**Push-Pull**](/products/cn/web-scraper-api/integration-methods/push-pull.md) 集成，请参阅 [**集成方法**](/products/cn/web-scraper-api/integration-methods.md) 部分。

{% file src="/files/3d27f0045af5760344065d0748e2363d263f9a57" %}

## 查询参数

<table><thead><tr><th width="178">参数</th><th width="264.1302083333333">说明</th><th width="196.3046875">默认值</th><th>类型</th></tr></thead><tbody><tr><td><mark style="background-color:green;"><strong><code>source</code></strong></mark></td><td>设置爬虫。</td><td><code>youtube_search</code> 或 <code>youtube_search_max</code></td><td>字符串</td></tr><tr><td><mark style="background-color:green;"><strong><code>查询</code></strong></mark></td><td>搜索词。</td><td>-</td><td>字符串</td></tr><tr><td><strong><code>geo_location</code></strong></td><td>指定请求路由来源国家。 <a href="/spaces/ZwEHB9k4MH4pDy80n9mF/pages/6f244fa2ed8311c561bf964b7afd534718285b6f">更多信息</a>.</td><td>-</td><td>字符串</td></tr></tbody></table>

&#x20;    \- 必需参数

### 筛选器

你可以使用 YouTube GUI 中可用的所有筛选器来自定义搜索。

<div align="left" data-full-width="false"><figure><img src="/files/b476537a24fadde225c08e2911aedfb6d59bbb0d" alt=""><figcaption></figcaption></figure></div>

#### **筛选查询参数**

<table><thead><tr><th width="165">参数</th><th width="364.3333333333333">说明</th><th width="129">默认值</th><th>类型</th></tr></thead><tbody><tr><td><code>upload_date</code></td><td>按上传日期筛选视频。可用值为： <code>today</code>, <code>last_hour</code>, <code>this_week</code>, <code>this_month</code>, <code>this_year</code>.</td><td>-</td><td>字符串</td></tr><tr><td><code>type</code></td><td>按内容类型返回结果。可用值为： <code>video</code>, <code>channel</code>, <code>playlist</code>, <code>movie</code>.</td><td>-</td><td>字符串</td></tr><tr><td><code>duration</code></td><td>内容时长（分钟）。可用值为： <code>&#x3C;4</code>,  <code>4-20</code>, <code>>20</code>. </td><td>-</td><td>字符串</td></tr><tr><td><code>sort_by</code></td><td>确定搜索结果的排序方式。可用值为 <code>rating</code>, <code>relevance</code>, <code>view_count</code>,<code>upload_date</code>.</td><td><code>relevance</code></td><td>字符串 </td></tr><tr><td><code>360</code></td><td>在搜索结果中返回 360 度视频。</td><td>-</td><td>布尔值</td></tr><tr><td><code>3d</code></td><td>在搜索结果中返回 3D 视频。</td><td>-</td><td>布尔值</td></tr><tr><td><code>4k</code></td><td>在搜索结果中返回 4K 分辨率视频。</td><td>-</td><td>布尔值</td></tr><tr><td><code>creative_commons</code></td><td>仅返回带有 Creative Commons 许可证的视频。</td><td>-</td><td>布尔值</td></tr><tr><td><code>hd</code></td><td>在搜索结果中返回高清晰度视频。</td><td>-</td><td>布尔值</td></tr><tr><td><code>hdr</code></td><td>在搜索结果中返回 HDR（高动态范围）视频。</td><td>-</td><td>布尔值</td></tr><tr><td><code>live</code></td><td>在搜索结果中返回直播流。</td><td>-</td><td>布尔值</td></tr><tr><td><code>location</code></td><td>仅返回带有位置标签的视频。</td><td>-</td><td>布尔值</td></tr><tr><td><code>purchased</code></td><td>在搜索结果中返回已购买内容。</td><td>-</td><td>布尔值</td></tr><tr><td><code>subtitles</code></td><td>返回带字幕或隐藏式字幕的视频。</td><td>-</td><td>布尔值 </td></tr><tr><td><code>vr180</code></td><td>在搜索结果中返回 VR180 格式视频。</td><td>-</td><td>布尔值 </td></tr></tbody></table>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://developers.oxylabs.io/api-targets/cn/shi-pin-he-she-jiao-mei-ti/youtube/youtube-search.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
