当站点流时,Python请求超时不合适

时间:2017-09-05 19:09:01

标签: python python-3.x python-requests

以下适用于99.999%的网站,但随机找到一个不适用的网站:

import requests
requests.get('http://arboleascity.com',timeout=(5,5),verify=False)

我已经就该项目提出了一个问题。

https://github.com/requests/requests/issues/4276

有任何建议或想法吗?

我在concurrent.futures.ThreadPoolExecutor中运行此操作,因此我并不想添加像eventlets或信号这样的外部内容。但对任何运作良好的事情都要开放。

3 个答案:

答案 0 :(得分:2)

它流式传输SHOUTcast流(Content-Type:audio / aacp),因此没有超时,它只是永远不会停止流式传输。

如果您想要主页而不是流,请将User-Agent标头设置为类似浏览器的标题。如果你想要音频流,请使用stream=True并迭代内容 - 如果需要,你也可以在这里拯救。

如果您正在编写一个scraper,您可能希望在尝试获取已分块的响应之前检查HEAD请求中的content-type。

答案 1 :(得分:1)

他们都在工作exactly as documented

  

连接超时是请求等待客户端与套接字上的远程计算机(对应于connect())调用建立连接的秒数。将连接超时设置为略大于3的倍数是一个很好的做法,这是默认的TCP数据包重新传输窗口。

     

一旦您的客户端连接到服务器并发送了HTTP请求,读取超时是客户端等待服务器发送响应的秒数。 (具体来说,它是客户端在从服务器发送的字节之间等待的秒数。在99.9%的情况下,这是服务器发送第一个字节之前的时间。)

答案 2 :(得分:1)

问题不在于requests,而在于您访问该特定网站的方式。

即使http://arboleascity.com似乎使用User-Agent标题字段来区分浏览器和音乐播放器。

如果您使用有效的浏览器签名,它只返回页面HTML(text/html)并关闭连接:

$ curl -vvv -A 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:54.0) Gecko/20100101 Firefox/54.0' http://arboleascity.com >/dev/null
...
< Content-Type: text/html;charset=utf-8
...
100   118    0   118    0     0    297      0 --:--:-- --:--:-- --:--:--   297
* Connection #0 to host arboleascity.com left intact

但是,如果您保留User-Agent未定义(默认值),则网站以~8kbps的速度传输二进制内容(audio/aacp):

$ curl -vvv http://arboleascity.com >/dev/null
...
< Content-Type: audio/aacp
...
< icy-notice1: <BR>This stream requires <a href="http://www.winamp.com">Winamp</a><BR>
< icy-notice2: SHOUTcast DNAS/posix(linux x64) v2.5.1.724<BR>
...
100  345k    0  345k    0     0  26975      0 --:--:--  0:00:13 --:--:--  7118^C

或者,with requests

>>> headers = {'user-agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:54.0) Gecko/20100101 Firefox/54.0'}
>>> r = requests.get('http://arboleascity.com', headers=headers)