如何限制stackexchange api返回的字段,并关闭分页



我想要一个较小(少于10000个问题)的stackexchange网站中所有问题的当前标题列表。我在这里尝试了交互式实用程序:https://api.stackexchange.com/docs/questions它在底部以json形式报告结果,并在顶部生成请求url。例如:

https://api.stackexchange.com/2.2/questions?order=desc&sort=activity&tagged=apples&site=cooking

在我的浏览器中返回以下JSON:

{"items":[{"tags":["apples","crumble"],"owner":{ ...
...
...],"has_more":true,"quota_max":300,"quota_remaining":252}

什么是配额?在一个网站上搜索一次是10000,但突然这里只有300。

我不会经常这样做,我想要的是最快的方式来编辑那个(当然也是类似的)url,这样我就可以在一个小网站上获得所有标题的列表。我不知道如何使用分页,也不需要任何其他字段。我不在乎我是否得到了它们,但我想如果我把它们排除在外,我可以一次得到更多。

如果我需要编写脚本,python(2.7)是我首选的(唯一)语言。

quota_max是应用程序每天允许的请求数。300是未注册应用程序的默认值。这曾经在描述节流阀的页面上直接提到,但似乎已经被删除了。以下是描述默认值的历史信息。

要将其增加到10000,您需要注册一个应用程序,然后通过在脚本中传递访问令牌进行身份验证。


要获得网站上的所有标题,您可以使用Python库来帮助:

  • StackAPI。下面的答案将使用此库免责声明:我写了这个库
  • Py StackExchange
  • 海港
  • StackPy

假设您已经注册了您的申请并通过了身份验证,我们可以继续。

首先,安装StackAPI(文档):

pip install stackapi

然后,此代码将获取站点hardwarerecs的10000个最新问题(max_pages*page_size)。每个页面花费一次API点击,因此每个页面的项目越多,API调用就越少。

from stackapi import StackAPI
SITE = StackAPI('hardwarerecs')
SITE.page_size = 100
SITE.max_pages = 100
# Filter to only get question title and link
filter = '!BHMIbze0EQ*ved8LyoO6rNjkuLgHPR'
questions = SITE.fetch('questions', filter=filter)

questions变量中有一个字典,看起来非常类似于API输出,只是库为您完成了所有分页。您的数据在questions['data']中,在本例中,包含一个字典列表,如下所示:

[
...
{u'link': u'http://hardwarerecs.stackexchange.com/questions/29/sound-board-to-replace-a-gl2200-in-a-house-of-worship-foh-setting',
u'title': u'Sound board to replace a GL2200 in a house-of-worship FOH setting?'},
{ u'link': u'http://hardwarerecs.stackexchange.com/questions/31/passive-gps-tracker-logger',
u'title': u'Passive GPS tracker/logger'}
...
]

由于我们应用了filter,此结果集仅限于标题和链接。您可以通过调整web UI中需要的字段并复制筛选器字段来找到合适的筛选器。

创建SITE参数时传递的hardwarerecs参数是站点域URL的第一部分。或者,您可以在查看/sites端点时查看站点的api_site_parameter来找到它。

最新更新