【问题标题】:How to get location of all user without hitting github API usage limit如何在不达到 github API 使用限制的情况下获取所有用户的位置
【发布时间】:2013-06-16 21:28:41
【问题描述】:

目前我正在尝试获取所有 Github 用户位置。我正在使用 github3 python 库来获取位置。但是当我的 api 调用超过 5K 时,它会给我过度 API 使用错误。这是我的代码。

import github3
from datetime import datetime
import sys

def main(pswd):
    g = github3.login(username="rakeshcusat", password=pswd)
    current_time = datetime.now()   
    fhandler = open("githubuser_"+current_time.strftime("%d-%m-%y-%H:%M:%S"), "w")

    for user in g.iter_all_users():
        user.refresh()
        try:
            fhandler.write(" user: {0}, email: {1}, location: {2}\n".format(str(user), str(user.email), str(user.location)))
        except:
            print "Something wrong, user id : {0}".format(user.id);


    fhandler.close()        

if __name__ == "__main__":

    if len(sys.argv) == 2:

        main(sys.argv[1])
    else:
        print "Please provide your password"

我可以通过首先下载所有用户名来做到这一点,这将只是一个 API 调用。然后迭代下载用户位置。如果遇到过度使用,则等待一小时并在其离开的地方恢复 api 调用。但这似乎是一个蹩脚的解决方案,而且肯定需要更多时间(几乎 25 多个小时)。有人可以为我提供更好的方法吗?

【问题讨论】:

  • @sigmavirus24 知道怎么做吗?
  • 抱歉,它没有 ping 我。

标签: python github github-api github3.py


【解决方案1】:

所以如果你使用的是github3.py的开发版本,你可以使用per_page参数,例如,

for user in g.iter_all_users(per_page=200):
    user.refresh()
    #: other logic

问题是,您将使用 per_page 保存 7 个请求(如果我没记错的话,现在 1 个请求会返回 25 个请求,因此您将在 1 个请求中获得 8 个请求)。问题是您使用User#refresh 相当快地使用了200 个请求。为了避免速率限制,您可以做的是在代码中使用 sleep 来分隔您的请求。在 3600 秒内拆分 5000 个请求是每秒 1.389 个请求。如果每个请求都需要半秒钟(我个人认为这是低估了),你可以这样做

import time

for user in g.iter_all_users(per_page=200):
    user.refresh()
    #: other logic
    time.sleep(0.5)

这将确保每秒发出一个请求,并且您永远不会达到速率限制。无论如何,它相当蹩脚。

将来,我会使用用户的 id 作为数据库中的 id 将这些值存储在数据库中,然后只查找最大值并尝试从那里开始。我必须检查/users 是否支持类似于since 参数的东西。或者,你也可以这样工作

import time

i = g.iter_all_users(per_page=200):
for user in i:
    user.refresh()
    #: other logic
    time.sleep(0.5)

# We have all users
# store i.etag somewhere then later
i = g.iter_all_users(per_page=200, etag=i.etag)
for user in i:
    user.refresh()
    #: etc

如果我没记错的话,第二个迭代器应该会为您提供自上次请求中的最后一个以来的所有新用户,但我目前很累,所以我可能记错了。

【讨论】:

  • 对于来自 github API 文档的用户 API “注意:分页仅由 'since' 参数提供支持。使用 Link 标头获取下一页用户的 URL。”这意味着用户确实支持自参数。 @sigmavirus24 你能举个例子吗?如何在 iter_all_users() api 调用中使用 since 参数?
  • @Rakesh 我才意识到我从来没有回答过你。如果您保留最后一个用户的 id,您将能够在新版本的 github3.py 中传递 since=id。我显然从未将该参数添加到iter_all_users
猜你喜欢
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
相关资源
最近更新 更多