Python的请求超时设置在网站流式传输时不适用。
Python的请求超时设置在网站流式传输时不适用。
以下方法适用于99.999%的网站,但偶然找到一个不适用的网站:\n
import requests requests.get('http://arboleascity.com',timeout=(5,5),verify=False)
\n我已在项目上提交了一个问题。\nhttps://github.com/requests/requests/issues/4276\n有什么建议或想法吗?\n我在concurrent.futures.ThreadPoolExecutor
中运行这个,所以我不想添加外部的东西,如eventlets或signals。但对任何有效的方法都持开放态度。
问题的原因是访问特定网站时使用的Python requests库的超时设置不适用于网站的流式传输。该网站使用了User-Agent头字段来区分浏览器和音乐播放器。如果使用有效的浏览器标识,它只会返回页面的HTML(text/html)并关闭连接。然而,如果未定义User-Agent(默认情况下),该网站会以约8kbps的速度流式传输二进制内容(audio/aacp)。
解决方法是使用自定义的headers参数来设置User-Agent头字段。可以通过在requests.get()函数中传递headers参数来实现:
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)
这样就可以正确地获取网站的HTML内容而不会触发流式传输。如果需要处理流式传输的情况(限制接收内容的大小),可以参考链接中提供的相关问题解决方法。
问题的出现原因是由于Python的requests库中的timeout参数不适用于网站流数据的情况。根据文档,timeout参数分为连接超时和读取超时两部分。连接超时是指请求等待建立与远程服务器的连接的时间,读取超时是指客户端等待服务器发送响应的时间。然而,在网站流数据的情况下,timeout参数的设置可能会造成问题。
解决方法是使用stream参数来处理网站流数据。通过设置stream参数为True,可以使得请求返回一个响应流,而不是直接获取响应内容。这样做可以避免由于请求过程中等待响应而导致的超时问题。
以下是使用stream参数的示例代码:
import requests url = 'http://example.com/streaming_data' # 设置stream参数为True,获取响应流 response = requests.get(url, stream=True) # 处理响应流数据 for chunk in response.iter_content(chunk_size=1024): # 处理每个数据块 print(chunk)
通过以上方法,我们可以正确处理网站流数据,并避免由于超时设置不合适而导致的问题。
Python的requests库在处理网站流式传输时,timeout参数不适用的原因是,流式传输没有固定的超时时间,因此设置timeout参数不会停止流式传输。如果你只想获取网站的首页而不是流式传输,可以设置User-Agent头部字段为类似浏览器的值。如果你想获取音频流,可以使用stream=True参数,并迭代内容。在这种情况下,你也可以根据需要提前结束迭代。
如果你正在编写一个网络爬虫,你可能需要在发起请求之前通过HEAD请求检查内容类型,以避免获取分块响应。这样可以提前判断是否需要进行流式传输的处理。
如果你遇到了这个问题,可以尝试上述方法解决。不过,如果你需要更稳定的处理方式,可能需要实现一些更复杂的逻辑。
代码示例:
import requests # 设置User-Agent头部字段,获取网站首页 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' } response = requests.get('http://example.com/', headers=headers) # 获取音频流 response = requests.get('http://example.com/stream', stream=True) for chunk in response.iter_content(chunk_size=1024): # 处理音频流的内容 if condition: break
希望以上方法能帮助你解决问题。