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 件のリクエストを行うことができます (これは、1 日あたりの全体的なリクエスト クォータに対しては 50 リクエストとしてカウントされますが、時間あたりのクォータに対しては 1 つとしてカウントされます)。最初にバッチ エンドポイントに POST リクエストを送信し、その結果に基づいて複数のリクエストを送信できるため、API の v2 を使用したバッチ処理は少し複雑です。ドキュメントは次のとおりです。

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パラメーターを に変更するid,snippet,contentDetailsか、必要に応じて適切なものに変更してください。

ドキュメントは次のとおりです。

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

于 2013-12-16T06:02:28.880 に答える