Python считывает данные веб-сайта по очереди, если доступно

Я использую urllib2 для чтения данных с URL-адреса, ниже - фрагмент кода:

data = urllib2.urlopen(urllink)
for lines in data.readlines():
  print lines

Url, который я открываю, на самом деле является cgi script, который выполняет некоторую обработку и печатает данные параллельно. CGI script занимает около 30 минут. Таким образом, с приведенным выше кодом я мог видеть вывод только через 3 минуты, когда выполнение CGI script завершено.

Как я могу прочитать данные из URL-адреса, как только он будет доступен, и распечатайте его.

Ответ 1

Просто проведите прямо по файловому объекту:

for line in data:
    print line

Это считывает входящий поток данных по строкам (внутри, файл файла сокета вызывает .readline() каждый раз, когда вы итерации). Это предполагает, что ваш сервер как можно скорее отправляет данные.

Вызов .readlines() (множественное число) гарантирует, что вы прочитали весь запрос до начала цикла, не делайте этого.

В качестве альтернативы используйте библиотеку requests, которая имеет более явную поддержку для потоковой передачи запросов:

import requests

r = requests.get(url, stream=True)

for line in r.iter_lines():
    if line: print line

Обратите внимание, что это будет работать, только если ваш сервер немедленно начнет передавать данные. Если ваш CGI не выводит данные до завершения процесса, нет смысла пытаться передать данные.