【问题标题】:How do I close a request to a streaming radio stream url?如何关闭对流式广播流 url 的请求?
【发布时间】:2014-11-28 05:04:23
【问题描述】:

我正在抓取一些带有请求的页面,并遇到了一个广播流的 url。我基本上只是想跳过它或做某种超时,但请求并没有结束:

u = 'http://streaming.radionomy.com/Cheche-International-Radio'
print 'started...', u
r = requests.get(u, timeout=1, stream=False)

我认为设置 stream=False 可以做到这一点,不是吗?我也尝试设置标题 headers['Connection'] = 'close' 但这也不起作用。在这两种情况下,请求都不会关闭。

谢谢!

【问题讨论】:

标签: python python-2.7 python-requests


【解决方案1】:

实际上,代码的行为符合预期,但参数可能并不符合您的预期。 timeout 是服务器开始发送响应需要多长时间的时间限制,但是您正在访问的服务器不需要很长时间才能开始响应......但它会发送无限响应。另一方面,stream,当设置为true(这是默认值)时,等到整个内容下载完毕;同样,内容永远不会结束,因此调用将永远不会返回(并且可能会占用您的 RAM)。

我认为您需要使用stream=False 发出请求,查看响应 HTTP 标头,如果内容不是您要查找的内容,则丢弃该请求。例如,您可以查看Content-Type;如果您只对text/html 回复感兴趣,则以下代码将起作用:

u = 'http://streaming.radionomy.com/Cheche-International-Radio'
print 'started...', u
r = requests.get(u, stream=True)
content_type = r.headers['Content-Type']
if content_type.startswith('text/html'):
    content = r.content
    # process the content
else:
    print 'discarded ', u

当然,您可以选择使用其他标准过滤请求。对于您的示例,标题是:

{
    'Expires': 'Mon, 26 Jul 1997 05:00:00 GMT',
    'icy-br': '128, 128',
    'Pragma': 'no-cache',
    'icy-name': 'ChecheInternationalRadio',
    'ice-audio-info': 'bitrate=128;samplerate=44100;channels=2',
    'Cache-Control': 'no-cache',
    'icy-genre': 'medellin',
    'Content-Type': 'audio/mpeg',
    'icy-description': 'Esta es una Emisora suena solo Exitos Una selecta programacion musical con los mejores artistas y canciones de todos los tiempos. Transmitiendo desde medellin Colombia.',
    'icy-pub': '1',
    'Accept-Ranges': 'none',
    'icy-url': 'http://cheche-international-radio.playtheradio.com/',
    'Server': 'Icecast 2.3.3-kh8'
}

其中一些是标准的,一些是 Icecast 特有的,选择更适合您的。

【讨论】:

    猜你喜欢
    • 2017-03-27
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 2012-07-20
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多