我正在尝试为一个将数据提供为 HTTP 流(又名 HTTP 服务器推送)的站点编写客户端。但是, urllib2.urlopen() 会抓取当前状态的流,然后关闭连接。我尝试跳过 urllib2 并直接使用 httplib,但这似乎具有相同的行为。
该请求是具有一组五个参数的 POST 请求。但是,不需要 cookie 或身份验证。
有没有办法让流保持打开状态,因此可以检查每个程序循环是否有新内容,而不是每隔几秒钟等待整个内容重新下载,从而引入延迟?
我正在尝试为一个将数据提供为 HTTP 流(又名 HTTP 服务器推送)的站点编写客户端。但是, urllib2.urlopen() 会抓取当前状态的流,然后关闭连接。我尝试跳过 urllib2 并直接使用 httplib,但这似乎具有相同的行为。
该请求是具有一组五个参数的 POST 请求。但是,不需要 cookie 或身份验证。
有没有办法让流保持打开状态,因此可以检查每个程序循环是否有新内容,而不是每隔几秒钟等待整个内容重新下载,从而引入延迟?
你可以试试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
您是否需要实际解析响应标头,或者您主要对内容感兴趣?您的 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
是(假设此站点也需要基本身份验证):
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()