首页 > 解决方案 > URI.open 无法获取 reddit JSON(错误 429)

问题描述

我正在尝试使用 Ruby 从 subreddit 中获取一些 JSON 数据;但它失败了,返回 429 错误。

  begin
    request = URI.open(
      'https://www.reddit.com/r/vintageobscura.json',
      {
      "User-Agent"=>"web:myapp:v1.0.0 (by /u/myusername)"
      }
    );
  rescue OpenURI::HTTPError => error
    response = error.io
    raise StandardError.new sprintf('Error while opening document: %s',response.status)
    #puts response.string
  end
end

当我在浏览器中加载 URL 时,它可以工作;如您所见,我根据他们的API 规则定义了一个用户代理。

知道为什么会失败吗?

非常感谢 !

标签: jsonrubyapireddithttp-status-code-429

解决方案


HTTP 429 表示请求过多。Reddit API 限制客户端、爬虫和爬虫。

在此处输入图像描述

您可以使用三个响应标头来检查速率限制状态。这是文档

  • X-Ratelimit-Used:此期间使用的大约请求数
  • X-Ratelimit-Remaining:大约剩余的请求数
  • X-Ratelimit-Reset:到周期结束的大约秒数
require "open-uri"

URI.open(
  'https://www.reddit.com/r/vintageobscura.json',
  "User-Agent"=>"web:myapp:v1.0.0 (by /u/myusername)"
) { |f| pp f.meta }

# {
#   "x-ratelimit-remaining"=>"289",
#   "x-ratelimit-used"=>"11",
#   "x-ratelimit-reset"=>"125",
#   ...
# }

Shopify /limiter gem可以帮助您的代码在再次请求后等待一段时间。或者您可以使用标头自行实现此等待机制。


推荐阅读