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