YouTube 下载器
了解如何使用 Web Scraper API 下载 YouTube 视频和音频内容。了解参数和云存储设置选项。
该 youtube_download source 提供您选择的 YouTube 视频的音频/视频内容。请注意,由于数据量可能较大,此 source 仅可通过异步 Push-Pull integration 和 Cloud Storage 功能可用。
YouTube 下载器的工作原理
通过 API 提交:
一个或多个 YouTube 视频 ID;
云存储详情。
获取 API 响应,确认您下载视频的请求已被成功接受。
当我们系统处理完视频后,可在指定的云存储位置获取这些视频。
注意:
下载器默认使用 720p 视频分辨率。如果 720p 不可用,下载器会选择低于 720p 的最佳可用质量。您可以使用
context: video_quality参数一起使用时该参数才有用。您可以下载最长 3 小时的视频。
下载时间限制为 1 小时。
输入参数值
source
设置抓取器。
youtube_download
query
YouTube 视频 ID。
-
storage_type
云服务的存储类型(gcs, s3 或 s3_compatible)
-
storage_url
要将结果上传到的云存储位置的存储桶名称(针对 AWS S3)或 URL(针对其他兼容 S3 的存储)。
-
context:
download_type
指定是否下载 音频, 视频,或两者 - audio_video.
audio_video
context:
video_quality
设置视频质量: best, worst,或一个分辨率 - 480, 720, 1080, 1440, 2160(4K).
720
提交单个任务
端点
POST https://data.oxylabs.io/v1/queries输入
按下面示例所示,在 JSON 有效负载中提供任务参数:
curl --user "user:pass1" \
'https://data.oxylabs.io/v1/queries' \
-H "Content-Type: application/json" \
-d '{
"source": "youtube_download",
"query": "9cQBNYsCqQs",
"storage_type": "s3",
"storage_url": "s3://your-s3-bucket/your-folder/"
}'import requests
from pprint import pprint
payload = {
"source": "youtube_download",
"query": "9cQBNYsCqQs",
"context": [
{
"key": "download_type",
"value": "video"
},
{
"key": "video_quality",
"value": "1080"
}
],
"storage_type": "s3",
"storage_url": "s3://your-s3-bucket/your-folder/"
}
response = requests.request(
'POST',
'https://data.oxylabs.io/v1/queries',
auth=('user', 'pass1'),
json=payload,
)
pprint(response.json())<?php
$params = array(
'source' => 'youtube_download',
'query' => '9cQBNYsCqQs',
"context" => [
[
"key" => "download_type",
"value" => "video",
],
[
"key" => "video_quality",
"value" => "1080",
]
],
'storage_type' => 's3',
'storage_url' => 's3://your-s3-bucket/your-folder/'
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://data.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, "YOUR_USERNAME" . ":" . "YOUR_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);
?>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 = "YOUR_USERNAME";
const string Password = "YOUR_PASSWORD";
var payload = new Dictionary<string, object>()
{
{ "source", "youtube_download" },
{ "query", "9cQBNYsCqQs" },
{ "context", new[] {
new { key = "download_type", value = "video" },
new { key = "video_quality", value = "1080" }
}},
{ "storage_type", "s3" },
{ "storage_url", "your-s3-bucket/your-folder/" }
};
var client = new HttpClient();
var requestMessage = new HttpRequestMessage(HttpMethod.Post, "https://data.oxylabs.io/v1/queries/batch");
requestMessage.Content = JsonContent.Create(payload);
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 main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
func main() {
const Username = "YOUR_USERNAME"
const Password = "YOUR_PASSWORD"
// Define the context structure
type ContextItem struct {
Key string `json:"key"`
Value string `json:"value"`
}
// Create payload with the same structure as the C# example
payload := map[string]interface{}{
"source": "youtube_download",
"query": []string{"9cQBNYsCqQs", "KGOsWPF4Wfs"},
"context": []ContextItem{
{Key: "download_type", Value: "video"},
{Key: "video_quality", Value: "1080"},
},
"storage_type": "s3",
"storage_url": "your-s3-bucket/your-folder/",
}
jsonValue, _ := json.Marshal(payload)
client := &http.Client{}
request, _ := http.NewRequest("POST",
"https://data.oxylabs.io/v1/queries/batch",
bytes.NewBuffer(jsonValue),
)
request.Header.Add("Content-type", "application/json")
request.SetBasicAuth(Username, Password)
response, _ := client.Do(request)
responseText, _ := ioutil.ReadAll(response.Body)
fmt.Println(string(responseText))
}package org.example;
import okhttp3.*;
import org.json.JSONArray;
import org.json.JSONObject;
public class Main implements Runnable {
private static final String AUTHORIZATION_HEADER = "Authorization";
public static final String USERNAME = "YOUR_USERNAME";
public static final String PASSWORD = "YOUR_PASSWORD";
public void run() {
JSONObject jsonObject = new JSONObject();
jsonObject.put("source", "youtube_download");
jsonObject.put("query", "9cQBNYsCqQs");
// Add context structure
JSONArray contextArray = new JSONArray();
JSONObject downloadTypeContext = new JSONObject();
downloadTypeContext.put("key", "download_type");
downloadTypeContext.put("value", "video");
contextArray.put(downloadTypeContext);
JSONObject videoQualityContext = new JSONObject();
videoQualityContext.put("key", "video_quality");
videoQualityContext.put("value", "1080");
contextArray.put(videoQualityContext);
jsonObject.put("context", contextArray);
jsonObject.put("storage_type", "s3");
jsonObject.put("storage_url", "your-s3-bucket/your-folder/");
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)
.build();
var mediaType = MediaType.parse("application/json; charset=utf-8");
var body = RequestBody.create(jsonObject.toString(), mediaType);
var request = new Request.Builder()
.url("https://data.oxylabs.io/v1/queries/batch")
.post(body)
.build();
try (var response = client.newCall(request).execute()) {
assert response.body() != null;
System.out.println(response.body().string());
} catch (Exception exception) {
System.out.println("Error: " + exception.getMessage());
}
System.exit(0);
}
public static void main(String[] args) {
new Thread(new Main()).start();
}
}import fetch from 'node-fetch';
const username = 'YOUR_USERNAME';
const password = 'YOUR_PASSWORD';
const body = {
source: 'youtube_download',
query: '9cQBNYsCqQs',
context: [
{ key: "download_type", value: "video" },
{ key: "video_quality", value: "1080"},
],
storage_type: 's3',
storage_url: 's3://your-s3-bucket/your-folder/'
};
const response = await fetch('https://data.oxylabs.io/v1/queries', {
method: 'post',
body: JSON.stringify(body),
headers: {
'Content-Type': 'application/json',
'Authorization': 'Basic ' + Buffer.from(`${username}:${password}`).toString('base64'),
}
});
console.log(await response.json());批处理任务
您可以在单个批量请求中提交最多 5,000 个视频 ID。
端点
POST https://data.oxylabs.io/v1/queries/batch重要说明: 使用 /batch 端点,您只能提交 query参数值。所有其他参数应为单一值。
输入
curl --user "user:pass1" \
'https://data.oxylabs.io/v1/queries/batch' \
-H 'Content-Type: application/json' \
-d '{
"source": "youtube_download",
"query": ["9cQBNYsCqQs", "KGOsWPF4Wfs"],
"context": [
{
"key": "download_type",
"value": "video"
},
{
"key": "video_quality",
"value": "1080"
}
],
"storage_type": "s3",
"storage_url": "your-s3-bucket/your-folder/"
}'import requests
import json
from pprint import pprint
payload = {
"source": "youtube_download",
"query": ["9cQBNYsCqQs", "KGOsWPF4Wfs"],
"context": [
{
"key": "download_type",
"value": "video"
},
{
"key": "video_quality",
"value": "1080"
}
],
"storage_type": "s3",
"storage_url": "your-s3-bucket/your-folder/"
}
response = requests.request(
'POST',
'https://data.oxylabs.io/v1/queries/batch',
auth=('user', 'pass1'),
json=payload,
)
# 打印美化后的响应。
pprint(response.json())<?php
$payload = array(
"source" => "youtube_download",
"query" => array("9cQBNYsCqQs", "KGOsWPF4Wfs"),
"context" => [
[
"key" => "download_type",
"value" => "video",
],
[
"key" => "video_quality",
"value" => "1080",
]
],
"storage_type" => "s3",
"storage_url" => "your-s3-bucket/your-folder/"
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://data.oxylabs.io/v1/queries/batch");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_USERPWD, "user" . ":" . "pass1");
$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);
?>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 = "YOUR_USERNAME";
const string Password = "YOUR_PASSWORD";
var payload = new Dictionary<string, object>()
{
{ "source", "youtube_download" },
{ "query", new[] { "9cQBNYsCqQs", "KGOsWPF4Wfs" } },
{ "context", new[] {
new { key = "download_type", value = "video" },
new { key = "video_quality", value = "1080" }
}},
{ "storage_type", "s3" },
{ "storage_url", "your-s3-bucket/your-folder/" }
};
var client = new HttpClient();
var requestMessage = new HttpRequestMessage(HttpMethod.Post, "https://data.oxylabs.io/v1/queries/batch");
requestMessage.Content = JsonContent.Create(payload);
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 main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
func main() {
const Username = "YOUR_USERNAME"
const Password = "YOUR_PASSWORD"
// Define the context structure
type ContextItem struct {
Key string `json:"key"`
Value string `json:"value"`
}
// Create payload with the same structure as the C# example
payload := map[string]interface{}{
"source": "youtube_download",
"query": "9cQBNYsCqQs",
"context": []ContextItem{
{Key: "download_type", Value: "video"},
{Key: "video_quality", Value: "1080"},
},
"storage_type": "s3",
"storage_url": "your-s3-bucket/your-folder/",
}
jsonValue, _ := json.Marshal(payload)
client := &http.Client{}
request, _ := http.NewRequest("POST",
"https://data.oxylabs.io/v1/queries/batch",
bytes.NewBuffer(jsonValue),
)
request.Header.Add("Content-type", "application/json")
request.SetBasicAuth(Username, Password)
response, _ := client.Do(request)
responseText, _ := ioutil.ReadAll(response.Body)
fmt.Println(string(responseText))
}package org.example;
import okhttp3.*;
import org.json.JSONArray;
import org.json.JSONObject;
public class Main implements Runnable {
private static final String AUTHORIZATION_HEADER = "Authorization";
public static final String USERNAME = "YOUR_USERNAME";
public static final String PASSWORD = "YOUR_PASSWORD";
public void run() {
JSONObject jsonObject = new JSONObject();
jsonObject.put("source", "youtube_download");
// 将 query 更改为类似 C# 示例中的数组格式
JSONArray queryArray = new JSONArray();
queryArray.put("9cQBNYsCqQs");
queryArray.put("KGOsWPF4Wfs");
jsonObject.put("query", queryArray);
// Add context structure
JSONArray contextArray = new JSONArray();
JSONObject downloadTypeContext = new JSONObject();
downloadTypeContext.put("key", "download_type");
downloadTypeContext.put("value", "video");
contextArray.put(downloadTypeContext);
JSONObject videoQualityContext = new JSONObject();
videoQualityContext.put("key", "video_quality");
videoQualityContext.put("value", "1080");
contextArray.put(videoQualityContext);
jsonObject.put("context", contextArray);
jsonObject.put("storage_type", "s3");
jsonObject.put("storage_url", "your-s3-bucket/your-folder/");
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)
.build();
var mediaType = MediaType.parse("application/json; charset=utf-8");
var body = RequestBody.create(jsonObject.toString(), mediaType);
var request = new Request.Builder()
.url("https://data.oxylabs.io/v1/queries/batch")
.post(body)
.build();
try (var response = client.newCall(request).execute()) {
assert response.body() != null;
System.out.println(response.body().string());
} catch (Exception exception) {
System.out.println("Error: " + exception.getMessage());
}
System.exit(0);
}
public static void main(String[] args) {
new Thread(new Main()).start();
}
}import fetch from 'node-fetch';
const username = 'YOUR_USERNAME';
const password = 'YOUR_PASSWORD';
const payload = {
source: 'youtube_download',
query: ['9cQBNYsCqQs', 'KGOsWPF4Wfs'],
context: [
{ key: "download_type", value: "video" },
{ key: "video_quality", value: "1080"},
]
storage_type: 's3',
storage_url: 'your-s3-bucket/your-folder/'
};
const response = await fetch('https://data.oxylabs.io/v1/queries/batch', {
method: 'post',
body: JSON.stringify(payload),
headers: {
'Content-Type': 'application/json',
'Authorization': 'Basic ' + Buffer.from(`${username}:${password}`).toString('base64'),
}
});
console.log(await response.json());API 将以 JSON 对象响应,包含为每个创建的任务返回的任务信息。任务状态将会是 pending 直到下载完成。
检查任务状态
如果您提供了有效的 回调 URL 在提交任务时,我们将在完成后通过向指定的回调 URL 发送一个 JSON 有效负载 来通知您。
但是,如果您提交任务时没有使用 回调服务,您可以手动检查任务状态。从提交任务后收到的响应中检索 href 字段中的 URL, rel:self 部分。检查任务状态的 URL 类似如下: http://data.oxylabs.io/v1/queries/12345678900987654321。查询此 URL 将返回任务信息,包括其当前 status.
端点
GET https://data.oxylabs.io/v1/queries/{id}云存储
您可以将 YouTube 视频传送到 Google Cloud Storage, Amazon S3, Alibaba OSS, 或 其他兼容 S3 的云存储.
内容文件将出现在您的云存储位置,并将根据以下命名模式之一命名:
{video_id}_{job_id}.mp4– 视频 文件{video_id}_{job_id}.m4a– 音频 文件
存储参数
storage_type
您的云存储类型。
gcs (Google Cloud Storage);
s3 (AWS S3);
s3_compatible (其他兼容 S3 的存储解决方案)。
storage_url
您的云存储 URL
任意 s3 或 gcs 存储桶名称;
任意 s3-兼容 存储 URL。
Google Cloud Storage 设置
要将作业结果上传到您的 Google Cloud Storage 存储桶,请 为我们的服务设置特殊权限 如我们在 Google Cloud Storage 文档.
{
"source": "youtube_download",
"query": "9cQBNYsCqQs",
"storage_type": "gcs",
"storage_url": "bucket_name/path"
}Amazon S3 设置
要将作业结果上传到您的 Amazon S3 存储桶,请为我们的服务设置访问权限。为此,请前往 https://s3.console.aws.amazon.com/ → S3 → 存储 → 存储桶名称 (如果您还没有,请创建一个) → 权限 → 存储桶策略.
使用下面的存储桶策略(别忘了在 YOUR_BUCKET_NAME):
{
"Version": "2012-10-17",
"Id": "Policy1577442634787",
"Statement": [
{
"Sid": "Stmt1577442633719",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::324311890426:user/oxylabs.s3.uploader"
},
"Action": "s3:GetBucketLocation",
"Resource": "arn:aws:s3:::YOUR_BUCKET_NAME"
},
{
"Sid": "Stmt1577442633719",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::324311890426:user/oxylabs.s3.uploader"
},
"Action": [
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*"
}
]
}此策略允许我们向您的存储桶写入,授予您对上传文件的访问权限,并知道存储桶的位置。
Alibaba Cloud OSS 设置
为了将结果保存到您的 Alibaba Cloud 对象存储服务 (OSS),您必须创建 ACCESS_KEY_ID 和 ACCESS_KEY_SECRET 并使用它们来构成存储 URL。请按照我们在 Alibaba Cloud OSS 文档 .
{
"source": "youtube_download",
"query": "9cQBNYsCqQs",
"storage_type": "s3_compatible",
"storage_url": "https://ACCESS_KEY_ID:ACCESS_KEY_SECRET@BUCKET_NAME.oss-REGION.aliyuncs.com/FOLDER_NAME"
}兼容 S3 的存储设置
如果您想将结果传送到其他兼容 S3 的存储位置,您需要包含您的存储桶的 ACCESS_KEY:SECRET 身份验证字符串在请求体的 storage_url 值中:
{
"source": "youtube_download",
"query": "9cQBNYsCqQs",
"storage_type": "s3_compatible",
"storage_url": "https://ACCESS_KEY:[email protected]/my-videos"
}最后更新于
这有帮助吗?

