【问题标题】:Paginating requests to an API对 API 的请求分页
【发布时间】:2010-05-05 00:34:01
【问题描述】:

我正在使用(通过urllib/urllib2)一个返回 XML 结果的 API。 API 始终为我的查询返回 total_hit_count,但只允许我分批检索结果,例如 100 或 1000。API 规定我需要指定 start_pos 和 end_pos 来抵消它,以便遍历结果。

假设 urllib 请求看起来像 http://someservice?query='test'&start_pos=X&end_pos=Y

如果我发送一个具有最低数据传输率的初始“品尝者”查询,例如http://someservice?query='test'&start_pos=1&end_pos=1,以获取total_hits = 1234 猜想的结果,我想制定一种最干净的请求方法那些 1234 的结果是成批的,再说一遍,100 或 1000 或...

这是我迄今为止想出的,它似乎有效,但我想知道你是否会做不同的事情,或者我是否可以改进:

hits_per_page=100 # or 1000 or 200 or whatever, adjustable
total_hits = 1234 # retreived with BSoup from 'taster query'
base_url = "http://someservice?query='test'"
startdoc_positions = [n for n in range(1, total_hits, hits_per_page)]
enddoc_positions = [startdoc_position + hits_per_page - 1 for startdoc_position in startdoc_positions]
for start, end in zip(startdoc_positions, enddoc_positions):
    if end > total_hits:
        end = total_hits
    print "url to request is:\n ",
    print "%s&start_pos=%s&end_pos=%s" % (base_url, start, end)

附言我是 StackOverflow 的长期消费者,尤其是 Python 问题,但这是我发布的第一个问题。你们真是太棒了。

【问题讨论】:

    标签: python api list-comprehension


    【解决方案1】:

    我建议使用

    positions = ((n, n + hits_per_page - 1) for n in xrange(1, total_hits, hits_per_page))
    for start, end in positions:
    

    然后不用担心end 是否超过hits_per_page,除非您使用的API 真的关心您是否请求超出范围的内容;大多数人都会优雅地处理这种情况。

    附:查看 httplib2 以替代 urllib/urllib2 组合。

    【讨论】:

    • 一片炸金,谢谢。我脱下帽子。现在,我如何“真正地”对您的出色意见表示满意?
    【解决方案2】:

    在这种情况下使用某种生成器来迭代列表可能会很有趣。

    def getitems(base_url, per_page=100):
        content = ...urllib...
        total_hits = get_total_hits(content)
        sofar = 0
        while sofar < total_hits:
            items_from_next_query = ...urllib...
            for item in items_from_next_query:
                sofar += 1
                yield item
    

    大部分只是伪代码,但如果您需要通过简化获取项目所需的逻辑来多次执行此操作,它可能会非常有用,因为它只返回一个在 python 中非常自然的列表。

    还可以为您节省大量重复代码。

    【讨论】:

      猜你喜欢
      • 2017-10-21
      • 2021-05-24
      • 2020-06-10
      • 1970-01-01
      • 1970-01-01
      • 2013-08-31
      • 2018-11-04
      • 2013-07-20
      • 1970-01-01
      相关资源
      最近更新 更多