用Python读取HTTP服务器推送流

用Python读取HTTP服务器推送流,python,http,server-push,Python,Http,Server Push,我正在尝试为一个站点编写一个客户端,该站点以HTTP流的形式提供数据(也称为HTTP服务器推送)。但是,urllib2.urlopen()会捕获当前状态的流,然后关闭连接。我尝试跳过urllib2并直接使用httplib,但这似乎具有相同的行为 该请求是一个POST请求,包含一组五个参数。但是,不需要cookie或身份验证 有没有办法让流保持打开状态,这样就可以在每个程序循环中检查新内容,而不是等待每隔几秒钟重新下载整个内容,从而引入延迟?您需要实际解析响应头,还是主要对内容感兴趣?您的HTTP

我正在尝试为一个站点编写一个客户端,该站点以HTTP流的形式提供数据(也称为HTTP服务器推送)。但是,urllib2.urlopen()会捕获当前状态的流,然后关闭连接。我尝试跳过urllib2并直接使用httplib,但这似乎具有相同的行为

该请求是一个POST请求,包含一组五个参数。但是,不需要cookie或身份验证


有没有办法让流保持打开状态,这样就可以在每个程序循环中检查新内容,而不是等待每隔几秒钟重新下载整个内容,从而引入延迟?

您需要实际解析响应头,还是主要对内容感兴趣?您的HTTP请求是否复杂,需要设置cookie和其他头,或者一个非常简单的请求就足够了

如果您只关心HTTP响应的主体并且没有一个非常复杂的请求,则应该简单地考虑使用套接字连接:

import socket

SERVER_ADDR = ("example.com", 80)

sock = socket.create_connection(SERVER_ADDR)
f = sock.makefile("r+", bufsize=0)

f.write("GET / HTTP/1.0\r\n"
      + "Host: example.com\r\n"    # you can put other headers here too
      + "\r\n")

# skip headers
while f.readline() != "\r\n":
    pass

# keep reading forever
while True:
    line = f.readline()     # blocks until more data is available
    if not line:
        break               # we ran out of data!

    print line

sock.close()

使用
urllib2
的一种方法是(假设此站点也需要基本身份验证):

你可以试试lib

您还可以添加参数:

import requests
settings = { 'interval': '1000', 'count':'50' }
url = 'http://agent.mtconnect.org/sample'

r = requests.get(url, params=settings, stream=True)

for line in r.iter_lines():
    if line:
        print line

这似乎不起作用。我放弃了auth,因为我不需要它,只是使用了一个HTTPHandler。还向循环中添加了一个sleep(),以防止它占用太多CPU,并在遇到任何数据时打印到屏幕上。当脚本启动时,它会按流中的内容运行,然后不会获得任何进一步的数据。然而,几秒钟后,连接似乎终止,我从服务器上得到一个“”并且没有进一步的数据。“保持活动”连接是否超时或出现类似情况,如果是,我如何停止它?@Sam:事实上,您正在阅读
,这意味着您实际上已经到达了输出的末尾。你确定还有更多吗?如果是这样,那么考虑设置<代码>连接:保持生存 HTTP头:肯定有更多,因为它出现在我的Web浏览器中读取同一个流。但是,查看页面源代码,JavaScript每六秒钟运行一次,将window.location更改为具有不同参数的POST请求;具体而言,它将“rnd=0.749976718186”更改为不同的数字。我不知道这是怎么回事,但我怀疑这与流提前终止有关。我得和溪流的主人谈谈,然后再打给你。问题解决了!我正在连接的页面要求每隔20秒左右刷新另一个连接,否则它会关闭连接,因为它认为您已断开连接。添加代码,每隔几秒钟抓取一次,宾果游戏,一切都很好用。谢谢
import requests
r = requests.get('http://httpbin.org/stream/20', stream=True)

for line in r.iter_lines():
    # filter out keep-alive new lines
    if line:
        print line
import requests
settings = { 'interval': '1000', 'count':'50' }
url = 'http://agent.mtconnect.org/sample'

r = requests.get(url, params=settings, stream=True)

for line in r.iter_lines():
    if line:
        print line