使用Python读取HTTP服务器推送流

4 投票
3 回答
5133 浏览
提问于 2025-04-15 22:02

我正在尝试写一个客户端,用来从一个提供数据的站点获取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()

撰写回答