关于 requests 的 timeout 的疑问

2016-12-05 15:59:23 +08:00
 JianBingXia
仔细看了下 requests 的官方文档,其中特别注明

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

现在遇到一个网站,响应时间非常快,但是"响应体的下载"非常慢,估计是防封策略故意设置的,这样我该如何应对呢?求老司机.
3376 次点击
所在节点    Python
10 条回复
cxh116
2016-12-05 16:05:52 +08:00
比如你抓取某台国内机器的资源,因为是在国内,所以建立连接很快,但它带宽只有 1M ,所以下载响应体很慢。
cloverstd
2016-12-05 16:06:39 +08:00
request 支持 stream 的方式,自己分片读,然后判断是否超时
JianBingXia
2016-12-05 16:08:27 +08:00
@cxh116 现在就是响应体下载很慢,想设置一个超时,应该怎么做呢?
JianBingXia
2016-12-05 16:10:06 +08:00
@cloverstd 如果我想设置一个针对响应体的超时怎么办呢?
cloverstd
2016-12-05 16:16:40 +08:00
@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
2016-12-05 16:24:05 +08:00
@cloverstd 感谢~~~,难为了我一下午的问题貌似有着落了,ORZ
ibigbug
2016-12-05 22:44:23 +08:00
timeout 可以设置 tuple 的, http://docs.python-requests.org/en/master/api/

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

要是服务器端关闭了,这个迭代器应该是会抛出异常的
wjhjd163
2020-08-06 23:45:17 +08:00
@cloverstd 但实际上它并不会抛出异常,至少我断网了 10 分钟还是正常的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/325421

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX