4

我正在开发一个应用程序,它可以从某些网站上抓取歌曲,并通过 Google 的 Youtube API 以编程方式在 youtube 上“喜欢”它们。为了获得我正在寻找的视频 ID,我使用艺术家和歌曲名称执行谷歌搜索并解析结果。此过程运行良好并返回有效的视频 ID(我已经手动测试过它们)。我遇到问题的地方是我基于视频 ID“点赞”的代码,它本质上是直接从谷歌的 YouTube API Python 示例中复制的:

def likeVideo(youtube, video_id):
    channels_list_response = youtube.channels().list(
      mine=True,
      part="contentDetails"
    ).execute()

    # Adding a video as a favorite or to the watch later list is done via the
    # same basic process. Just read the list id of the corresponding playlist
    # instead of "likes" as we're doing here.
    liked_list_id = channels_list_response["items"][0]["contentDetails"]["relatedPlaylists"]["likes"]

    body = dict(
      snippet=dict(
        playlistId=liked_list_id,
        resourceId=dict(
          kind="youtube#video",
          videoId=video_id
        )
      )
    )
    youtube.playlistItems().insert(
      part=",".join(body.keys()),
      body=body
    ).execute()

    print "%s has been liked." % video_id

但是,我的应用程序抛出了这个错误:

apiclient.errors.HttpError: <HttpError 503 when requesting https://www.googleapis.com/youtube/v3/playlistItems?alt=json&part=snippet returned "Backend Error">

通过谷歌开发论坛搜索显示这可能是谷歌的服务器端问题,但我不确定我的具体情况。任何人都看到什么可能是错的?

编辑:过去几天我一直在使用这个应用程序,它似乎工作得还不错;很少有 503 错误...但是,此时通常每个会话只执行一个 API 请求。当我第一次遇到错误时,它正在执行大约 6 个批处理。在执行批处理请求时是否发生了我应该考虑的问题?

4

1 回答 1

4

它不会让我评论你的问题,我并不认为这是一个答案,但也许只是需要考虑的事情。前段时间我在做一个项目,我有一个 CSV 列表,里面有 youtube 视频 URL。我想将视频的标题放在我的 CSV 列表中的 URL 旁边。鉴于页面的标题是视频的标题,我利用 URLLIB 从列表中的 URL 中抓取页面,抓取标题,将其放入我的列表中,然后循环浏览下一个,下一个,等等等等。无论如何,我只得到了部分结果!其中只有一半有效。好吧,事实证明我用 URLLIB 访问 youtube 的速度太快了,他们的服务器一定是在限制我或者其他什么,我实现了一个 5-15 秒的计时器并得到了不同的结果。我在每个视频之间做了 15 秒,我能够得到每个页面的标题。现在授予您使用我一无所知的youtube API,但也许通过他们的API调用youtube数据也会以某种方式受到限制?我只是在这里吐痰,很抱歉将其发布为答案,但我似乎找不到评论按钮!

编辑 - 要尝试使这看起来更像是一个答案,请尝试利用时间模块在 API 调用之间休眠。

while 0 == 0
  likeVideo(youtube, video_id)
  time.sleep(15)

希望这会有所帮助,或者至少其他人可以。祝你好运!

于 2013-02-01T15:13:05.420 回答