Чтение push-потоков HTTP-сервера с помощью Python - PullRequest
3 голосов
/ 27 апреля 2010

Я пытаюсь написать клиент для сайта, который предоставляет данные в виде потока HTTP (он же HTTP-сервер). Однако urllib2.urlopen () захватывает поток в его текущем состоянии и затем закрывает соединение. Я попытался пропустить urllib2 и напрямую использовать httplib, но, похоже, это происходит так же.

Запрос представляет собой запрос POST с набором из пяти параметров. Однако файлы cookie или проверка подлинности не требуются.

Есть ли способ заставить поток оставаться открытым, чтобы можно было проверять каждый цикл программы на наличие нового содержимого вместо того, чтобы ждать, пока все это будет перезагружено каждые несколько секунд, что приводит к задержке?

Ответы [ 3 ]

1 голос
/ 27 августа 2013

Вы можете попробовать запросы lib.

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 голос
/ 27 апреля 2010

Нужно ли вам на самом деле анализировать заголовки ответа, или вы в основном заинтересованы в контенте? Является ли ваш 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()
0 голосов
/ 27 апреля 2010

Один из способов сделать это с помощью 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()
...