1

我有一个来自不同播放列表的 youtube 视频列表,我需要检查这些视频是否仍然有效(大约 1000 个)。我现在正在做的是使用它的 API v2 和 Groovy 和这个简单的脚本来访问 Youtube:

import groovyx.net.http.HTTPBuilder
import static groovyx.net.http.Method.GET

http = new HTTPBuilder('http://gdata.youtube.com')

myVideoIds.each { id ->
    if (!isValidYoutubeUrl(id)) {
        // do stuff
    }
}

boolean isValidYoutubeUrl (id) {
    boolean valid = true
    http.request(GET) {
        uri.path = "feeds/api/videos/${id}"

        headers.'User-Agent' = 'Mozilla/5.0 Ubuntu/8.10 Firefox/3.0.4'

        response.failure = { resp ->
            valid = false
        }
    }
    valid
}

但几秒钟后,它开始为任何单个 id 返回 403(这可能是由于它运行的请求太多)。如果我插入类似Thread.sleep(3000). 有没有比仅仅延迟请求更好的解决方案?

4

1 回答 1

2

在 API 的 V2 中,您可以发出多少请求有基于时间的限制,但它们并不是一个硬性和快速的限制(也就是说,它在某种程度上取决于许多幕后因素,并且可能并不总是相同的限制)。这是文档中的内容:

YouTube API 强制执行配额以防止与不正常 API 使用相关的问题。具体来说,too_many_recent_calls 错误表明 API 服务器在短时间内收到了来自同一调用者的过多调用。如果您收到此类错误,我们建议您等待几分钟,然后重试您的请求。

你可以通过像你一样进入睡眠来避免这种情况,但你希望它是 10-15 秒左右。

但是,更重要的是实现批处理。有了这个,您一次最多可以发出 50 个请求(这算作 50 个请求与您每天的总请求配额相比,但仅算作您的每次配额一个)。使用 API 的 v2 进行批处理有点涉及,因为您首先向批处理端点发出 POST 请求,然后根据这些结果您可以发送多个请求。这是文档:

https://developers.google.com/youtube/2.0/developers_guide_protocol?hl=en#Batch_processing

如果您使用 API 的 v3,批处理会变得相当容易,因为您一次只需在请求中发送 50 个 ID。改变:

http = new HTTPBuilder('http://gdata.youtube.com')

至:

http = new HTTPBuilder('https://www.googleapis.com')

然后将您的设置uri.path

youtube/v3/videos?part=id&max_results=key={your API key}&id={variable here that represents 50 YouTube IDs, comma separated}

那么,对于 1000 个视频,您只需拨打 20 个电话。列表中没有返回的任何视频都不再存在(如果您需要获取视频详细信息,请将part参数更改为 beid,snippet,contentDetails或适合您需要的参数。

这是文档:

https://developers.google.com/youtube/v3/docs/videos/list#id

于 2013-12-16T06:02:28.880 回答