首页 > 解决方案 > Imgur API - 如何在不分页的情况下检索所有收藏夹?

问题描述

根据Imgur Docs,“GET Account Favorites”API 调用采用可选参数进行分页,这意味着所有对象都在没有它的情况下返回。

但是,当我使用以下代码片段(应用程序已注册并且已针对我的帐户执行 OAuth 以进行测试)时,我仅获得前 30 个 JSON 对象。在下面的代码片段中,我已经有一个授权用户的 access_token 并且可以检索该用户名的数据。但返回列表的长度始终是前 30 项。

username = token['username']
bearer_headers = {
    'Authorization': 'Bearer ' + token['access_token']
}
fav_url = 'https://api.imgur.com/3/account/' + username + '/' + 'favorites'
r = requests.get(fav_url, headers=bearer_headers)
r_json = r.json()
favorites=r_json['data']
len(favorites)
print(favorites)

requests 响应返回一个包含三个键的字典:status(HTTP 状态代码)、success(true 或 false)和 data,其中的值是一个字典列表(每个收藏项一个)。

我试图在没有分页的情况下检索它,以便我可以将特定的元数据值提取到 Pandas 数据框中(id、发布日期等)。

我最初认为这是 Jupyter 笔记本中的 Pandas 显示问题,但将其追溯到 API 仅返回最新的 30 个列表项,尽管文档另有说明。如果我在末尾放置一个任意页码(例如,“/favorites/1”),它会返回适合该页面的 30 个项目,但似乎没有获取所有项目或检索计数的选项总项目或页数。

我错过了什么?

后记:似乎没有分页,所有 URI 都无法工作,例如,获取帐户图像,获取画廊提交等。任何有可选“/{{page}}”参数的地方,如果没有,它将默认为第一页指定的。所以我想更大的问题是,“Imgur API 是否甚至支持非分页数据,以及如何访问?”。

标签: pythonimgur

解决方案


当响应的可能大小可以任意大时,通常使用分页数据。如果像 Imgur 这样的主要服务有一个不能以这种方式工作的 API,我会感到惊讶。

正如您所发现的,该page属性可能是可选的,如果您不提供它,您将获得第一页作为您的响应。

如果您想获得比第一页更多的信息,则需要遍历页码:

data = []
page = 0
while block := connection.get(page=page):
  data.append(block)
  page += 1

由于:=赋值表达式,这假定 Python3.8+。如果您使用的是旧版本,则需要block在循环体中进行设置,但同样的想法也适用。


推荐阅读