【问题标题】:Looping through a paginated api asynchronously异步循环分页 api
【发布时间】:2016-10-11 23:43:07
【问题描述】:

我目前正在通过一个 API 提取数据,该 API 以分页方式返回近 100,000 个文档(每页 100 个)。我目前有一些代码大致如下:

while c <= limit:
    if not api_url:
        break

    req = urllib2.Request(api_url)
    opener = urllib2.build_opener()
    f = opener.open(req)
    response = simplejson.load(f)

    for item in response['documents']:
        # DO SOMETHING HERE 
    if 'more_url' in response:
        api_url = response['more_url']
    else:
        api_url = None
        break
    c += 1

以这种方式下载数据真的很慢,我想知道是否有任何方法可以以异步方式循环浏览页面。有人建议我看看twisted,但我不完全确定如何继续。

【问题讨论】:

  • 一种直接的方法是重用与服务器的连接。我强烈建议使用requests 处理所有与 HTTP 相关的内容。此外,您能否预测下一页令牌(在您的情况下为more_url)。如果可以的话,消息可以并行发送,这将大大加快整个操作。
  • 不幸的是,more_url 是不可预测的。我会看看请求,谢谢!

标签: python api asynchronous pagination twisted


【解决方案1】:

这里的情况是,除非您调用 API,否则您不知道接下来要阅读的内容。想一想,你可以并行做什么?

我不知道你可以并行做多少以及哪些任务,但让我们试试......

一些假设: - 您可以从 API 中检索数据而不受处罚或限制 - 一页/批次的数据处理可以彼此独立完成

缓慢的是 IO - 因此您可以立即将代码拆分为两个并行运行的任务 - 一个将读取数据,然后将其放入队列并继续读取,除非达到限制/空响应或如果队列已满则暂停

然后是第二个任务,即从队列中获取数据,并对数据做一些事情

这样你就可以从另一个任务调用一个任务

另一种方法是您有一个任务,即在读取数据后立即调用另一个任务,因此它们的执行将并行运行但略有偏移

我将如何实现它?作为celery 任务,是的requests

例如第二个:

@task
def do_data_process(data):
   # do something with data
   pass

@task
def parse_one_page(url):
    response = requests.get(url)
    data = response.json()

    if 'more_url' in data:
        parse_one_page.delay(data['more_url'])

    # and here do data processing in this task
    do_data_process(data)
    # or call worker and try to do this in other process
    # do_data_process.delay(data)

如果您要为代码添加限制,您将并行运行多少个任务取决于您,您甚至可以在多台机器上拥有工作人员并为parse_one_pagedo_data_process 设置单独的队列

为什么采用这种方法,而不是扭曲或异步?

因为您有 cpu-bond 数据处理(json,然后是数据),因此最好有单独的进程,而 celery 非常适合它们。

【讨论】:

  • 感谢 Jerzyk 的详细回答。我确实设置了 celery 并尝试了你的方法,但我最终采取了一条稍微不同且更容易(IMO)的路线来解决这个问题。我启动了一个进程来访问 API 并使用requests 将 json 下载到一个 tmp 文件夹并使用 python 包watchdog 来监视对该目录的更改,每次创建文件时,我都会处理它并且我能够在 15 分钟内完成整个过程(约 1000 页数据)。感谢您的帮助。
  • @Srinath 您还可以创建一个 url 列表,参数 = 页码并同时对所有 url 进行多线程调用,连接数据帧并合并为一个。
猜你喜欢
  • 1970-01-01
  • 2020-07-03
  • 2018-10-17
  • 2016-07-08
  • 2018-09-18
  • 2013-02-16
  • 2019-03-24
  • 2021-06-01
  • 2017-05-02
相关资源
最近更新 更多