Python的请求超时设置在网站流式传输时不适用。

14 浏览
0 Comments

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。但对任何有效的方法都持开放态度。

0
0 Comments

问题的原因是访问特定网站时使用的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内容而不会触发流式传输。如果需要处理流式传输的情况(限制接收内容的大小),可以参考链接中提供的相关问题解决方法。

0
0 Comments

问题的出现原因是由于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)

通过以上方法,我们可以正确处理网站流数据,并避免由于超时设置不合适而导致的问题。

0
0 Comments

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

希望以上方法能帮助你解决问题。

0