V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
JianBingXia
V2EX  ›  Python

关于 requests 的 timeout 的疑问

  •  
  •   JianBingXia · 2016-12-05 15:59:23 +08:00 · 3347 次点击
    这是一个创建于 2911 天前的主题,其中的信息可能已经有所发展或是发生改变。
    仔细看了下 requests 的官方文档,其中特别注明

    "timeout 仅对连接过程有效,与响应体的下载无关。 timeout 并不是整个下载响应的时间限制,而是如果服务器在 timeout 秒内没有应答,将会引发一个异常(更精确地说,是在 timeout 秒内没有从基础套接字上接收到任何字节的数据时)"

    现在遇到一个网站,响应时间非常快,但是"响应体的下载"非常慢,估计是防封策略故意设置的,这样我该如何应对呢?求老司机.
    10 条回复    2020-08-06 23:45:17 +08:00
    cxh116
        1
    cxh116  
       2016-12-05 16:05:52 +08:00 via Android   ❤️ 1
    比如你抓取某台国内机器的资源,因为是在国内,所以建立连接很快,但它带宽只有 1M ,所以下载响应体很慢。
    cloverstd
        2
    cloverstd  
       2016-12-05 16:06:39 +08:00
    request 支持 stream 的方式,自己分片读,然后判断是否超时
    JianBingXia
        3
    JianBingXia  
    OP
       2016-12-05 16:08:27 +08:00
    @cxh116 现在就是响应体下载很慢,想设置一个超时,应该怎么做呢?
    JianBingXia
        4
    JianBingXia  
    OP
       2016-12-05 16:10:06 +08:00
    @cloverstd 如果我想设置一个针对响应体的超时怎么办呢?
    cloverstd
        5
    cloverstd  
       2016-12-05 16:16:40 +08:00   ❤️ 1
    @JianBingXia

    http://docs.python-requests.org/en/master/user/advanced/#streaming-requests

    started_time = time.time()
    timeout = 60

    r = requests.get('http://httpbin.org/stream/20', stream=True)

    if r.encoding is None:
    r.encoding = 'utf-8'

    for line in r.iter_lines(decode_unicode=True):
    if time.time() - started_time > 60:
    print "timeout"
    break
    if line:
    print json.loads(line)
    JianBingXia
        6
    JianBingXia  
    OP
       2016-12-05 16:24:05 +08:00
    @cloverstd 感谢~~~,难为了我一下午的问题貌似有着落了,ORZ
    ibigbug
        7
    ibigbug  
       2016-12-05 22:44:23 +08:00
    timeout 可以设置 tuple 的, http://docs.python-requests.org/en/master/api/

    看文档啊,少年。
    ibigbug
        8
    ibigbug  
       2016-12-05 22:46:34 +08:00
    @cloverstd 这个路子好野。 60 是拍脑袋出来的? 万一 10s 服务端就把连接关了呢。
    cloverstd
        9
    cloverstd  
       2016-12-05 22:50:01 +08:00
    @ibigbug 这个只是举个例子可以这样玩

    要是服务器端关闭了,这个迭代器应该是会抛出异常的
    wjhjd163
        10
    wjhjd163  
       2020-08-06 23:45:17 +08:00
    @cloverstd 但实际上它并不会抛出异常,至少我断网了 10 分钟还是正常的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5584 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 07:17 · PVG 15:17 · LAX 23:17 · JFK 02:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.