Python 从 API 请求流数据

问题描述 投票:0回答:2

用例:我正在尝试连接到流API,摄取这些事件,过滤它们并保存相关事件。

问题:我的代码在大约第 1100 个响应之前运行良好。此后,代码不会崩溃,但似乎停止从流中提取更多数据。我猜测这是某种缓冲区问题,但老实说流媒体对我来说是新的,我不知道是什么导致了这个问题。

代码

import requests
def stream():
    s = requests.Session()
    r = s.get(url, headers=headers, stream=True)
    for line in r.iter_lines():
        if line:
            print(line)

我也在没有会话对象的情况下尝试过这个,并且得到了相同的结果。

是否有我忽略的参数或我不知道的概念?我已经浏览了文档/互联网,但没有任何内容让我惊讶。

非常感谢任何帮助。

编辑 在我看来,一切看起来都是正确的,我认为流只是在初始连接时生成大量事件,然后它们就会减慢速度。然而现在的问题是,连接几分钟后我收到此错误:

Traceback (most recent call last):
  File "C:\Users\joe\PycharmProjects\proj\venv\lib\site-packages\urllib3\response.py", line 572, in _update_chunk_length
    self.chunk_left = int(line, 16)
ValueError: invalid literal for int() with base 16: b''
python python-3.x python-requests
2个回答
16
投票

遵循 “正文内容工作流程”

requests
库)部分指南来传输数据。

方法示例:

import requests

def get_stream(url):
    s = requests.Session()

    with s.get(url, headers=None, stream=True) as resp:
        for line in resp.iter_lines():
            if line:
                print(line)

url = 'https://jsonplaceholder.typicode.com/posts/1'
get_stream(url)

输出:

b'{'
b'  "userId": 1,'
b'  "id": 1,'
b'  "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",'
b'  "body": "quia et suscipit\\nsuscipit recusandae consequuntur expedita et cum\\nreprehenderit molestiae ut ut quas totam\\nnostrum rerum est autem sunt rem eveniet architecto"'
b'}'

5
投票

您可能会受到速率限制。尝试打印请求对象的状态代码。

例如,在您的代码中:

import requests
def stream():
    s = requests.Session()
    r = s.get(url, headers=headers, stream=True)
    print(r.status_code)
    for line in r.iter_lines():
        if line:
            print(line)

运行此命令,直到收到第 1100 个响应。您拨打的服务可能有速率限制。如果您收到 429 响应,则意味着您必须等待一段时间才能继续拨打电话。

© www.soinside.com 2019 - 2024. All rights reserved.