使用Python读取HTTP服务器推送流
我正在尝试写一个客户端,用来从一个提供数据的站点获取HTTP流(也就是HTTP服务器推送)。不过,使用urllib2.urlopen()时,它会抓取当前的流,然后就关闭连接了。我试着跳过urllib2,直接用httplib,但似乎也有同样的问题。
这个请求是一个POST请求,包含五个参数。并不需要任何cookie或身份验证。
有没有办法让这个流保持打开状态,这样我就可以在每次程序循环中检查新内容,而不是每隔几秒就重新下载整个内容,这样会造成延迟?
3 个回答
0
使用 urllib2
来实现这个功能的一种方法是(假设这个网站也需要基本认证):
import urllib2
p_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
url = 'http://streamingsite.com'
p_mgr.add_password(None, url, 'login', 'password')
auth = urllib2.HTTPBasicAuthHandler(p_mgr)
opener = urllib2.build_opener(auth)
urllib2.install_opener(opener)
f = opener.open('http://streamingsite.com')
while True:
data = f.readline()
2
你可以试试这个叫做 requests 的库。
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
1
你真的需要解析响应头吗?还是说你主要关心的是内容?还有,你的HTTP请求复杂吗?需要设置cookies和其他头信息,还是说一个简单的请求就可以了?
如果你只关心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()