json - 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 规则定义了一个用户代理。
知道为什么会失败吗?
非常感谢 !
解决方案
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可以帮助您的代码在再次请求后等待一段时间。或者您可以使用标头自行实现此等待机制。
推荐阅读
- azure-sql-database - Azure SQL“执行 GlobalQuery 操作时发生错误:在时区遇到不受支持的内部表达式。”
- java - ExifTool:删除图像的所有元数据,Java应用程序中的元数据除外
- python - 如何在不使用 replace() 方法的情况下从字符串中删除特定元素?
- python - 在 matplotlib 中缩放 y 轴
- mongodb - BsonChunkPool 和内存泄漏
- python - 通过 python 在 OSX 上检索 ATI GPU 信息(内存、GPU 负载等)
- android-studio - Android Studio 和 Flutter(VSCode) 显示同样的问题 sun.security.ec.ECKeyPairGenerator.isCurveSupported([B)Z
- algorithm - 余数运算符在哈希算法中确定索引的作用
- javascript - 如何在节点js中将图像类型更改为JPG
- python-3.x - 我怎样才能增加一个变量,以便它存储我想要的值?