【问题标题】:Reading HTTP server push streams with Python使用 Python 读取 HTTP 服务器推送流
【发布时间】:2010-04-26 20:53:14
【问题描述】:

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

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

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

【问题讨论】:

    标签: python http server-push


    【解决方案1】:

    你可以试试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
    

    【讨论】:

      【解决方案2】:

      您是否需要实际解析响应标头,或者您主要对内容感兴趣?您的 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()
      

      【讨论】:

      • 这有点用(一旦我得到了一个 POST 请求的标题,无论如何)。然而,几秒钟后,连接似乎终止了,我从服务器得到一个“
      【解决方案3】:

      使用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()
      

      【讨论】:

      • 这似乎不起作用。我放弃了身份验证的东西,因为我不需要它,只使用了一个 HTTPHandler。还在循环中添加了一个 sleep() 以阻止它消耗过多的 CPU,并在遇到任何数据时打印到屏幕。它运行脚本启动时存在的流内容,然后不再获取任何数据。
      猜你喜欢
      • 2015-04-11
      • 1970-01-01
      • 2011-08-17
      • 2017-09-06
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多