以下适用于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或信号这样的外部内容。但对任何运作良好的事情都要开放。
答案 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)