Как вызвать Streaming/Filter Feed Twitter с помощью urllib2/httplib?

Обновлять:

Я переключил это обратно с ответа, когда попробовал решение, представленное в убедительном ответе Ника, и переключился на urfetch Google:

logging.debug("starting urlfetch for http://%s%s" % (self.host, self.url))
result = urlfetch.fetch("http://%s%s" % (self.host, self.url), payload=self.body, method="POST", headers=self.headers, allow_truncated=True, deadline=5)
logging.debug("finished urlfetch")

но, к сожалению, finished urlfetch никогда не печатается - я вижу, что тайм-аут произошел в журналах (он возвращает 200 через 5 секунд), но выполнение, похоже, не возвращается.


Всем привет-

Я пытаюсь поиграть с API Streaming (aka firehose) Twitter с Google App Engine (я знаю, что это, вероятно, не лучшая долгосрочная игра, поскольку вы не можете постоянно поддерживать соединение с GAE), но до сих пор мне не удавалось заставить мою программу фактически анализировать результаты. вернулся из Твиттера.

Некоторый код:

logging.debug("firing up urllib2")
req = urllib2.Request(url="http://%s%s" % (self.host, self.url), data=self.body, headers=self.headers)
logging.debug("called urlopen for %s %s, about to call urlopen" % (self.host, self.url))
fobj = urllib2.urlopen(req)
logging.debug("called urlopen")

К сожалению, когда это выполняется, мой вывод отладки никогда не показывает напечатанную строку called urlopen. Я подозреваю, что происходит то, что Twitter держит соединение открытым, а urllib2 не возвращается, потому что сервер не разрывает соединение.

Wireshark показывает, что запрос был отправлен правильно, а ответ возвращен с результатами.

Я попытался добавить Connection: close в заголовок моего запроса, но это не дало успешного результата.

Любые идеи о том, как заставить это работать?


person Simon    schedule 30.03.2010    source источник
comment
Вероятно, вам нужно перехватить ошибку DeadlineExceededError, которую выдаст тайм-аут, если вы хотите продолжить запись в журнал.   -  person Wooble    schedule 23.08.2011


Ответы (1)


urllib в App Engine — это тонкая оболочка для urlfetch API. Вы правы в том, что происходит: потоковый API Твиттера никогда не прекращает свой ответ, поэтому время ожидания истекает, и urfetch выдает исключение.

Если вы используете urfetch напрямую, вы можете установить время ожидания (до 10 секунд) и установить для параметра allow_truncated значение True, чтобы вы могли получить частичный результат. API потоковой передачи Twitter действительно не очень хорошо подходит для App Engine, поскольку время выполнения запросов App Engine ограничено 30 секундами, а запросы urfetch не могут возвращать результаты постепенно или занимают более 10 секунд. Использование «стандартного» API Twitter было бы лучшим вариантом.

person Nick Johnson    schedule 30.03.2010
comment
Спасибо - это отличное объяснение того, что происходит. Re: «стандартный» API, я полагаю, вы имеете в виду что-то вроде apiwiki.twitter.com/ — но ведь нет отличного аналога возможности фильтрации потока, не так ли? - person Simon; 30.03.2010
comment
Это зависит от того, как вы хотите фильтровать. Стандартный «поиск» API делает большую часть этого. Другой альтернативой может быть развертывание службы в другом месте, которая использует потоковый API и упаковывает пакеты для отправки в ваше приложение через HTTP. На самом деле я написал небольшой инструмент, чтобы сделать именно это, если вам интересно. - person Nick Johnson; 30.03.2010
comment
Я определенно был бы заинтересован в таком инструменте, если вы готовы поделиться! - person Simon; 30.03.2010
comment
Вот он, такой как есть: github.com/Arachnid/whofoundit/blob /master/feeder.py . Он не очень отполирован, но основной рабочий процесс ясен: он использует шаблон производителя/потребителя для получения записей из Twitter и добавления их в очередь. Разорванные соединения автоматически повторяются. Потребитель извлекает пакеты из очереди и загружает их в любую конечную точку HTTP с пакетом каждые n результатов или m секунд (в зависимости от того, что наступит раньше). - person Nick Johnson; 30.03.2010
comment
@NickJohnson Линк мертв. Я ищу в вашем проекте tweetengine идеи о том, как создать приложение Twitter на GAE, но я не знаю, как реализовать хороший способ работы с Stream API. Если у вас все еще есть вышеупомянутый пример, я бы хотел его увидеть. - person jmlane; 03.04.2012