Python praw reddit api: надежно получайте сообщения по мере их публикации

На данный момент у меня есть скрипт, который запрашивает некоторые субреддиты каждые 30 секунд и возвращает самое новое представление:

while True:

    for post in reddit.subreddit(query_list).new(limit=1):

        if previous != post:
             # Do something

        previous = post

    time.sleep(30)

Проблема в том, что если за этот период времени будет больше двух сообщений, он пропустит одну из них. Я знаю, что могу установить меньшее время ожидания, или я могу получать более одного сообщения за раз и сортировать результаты, но на самом деле это не решает проблему, а просто снижает вероятность.

Я бы предпочел «подписаться» на канал, имея постоянно открытое соединение, которое получает сообщения по мере их публикации. Это существует? А если нет, есть ли другое решение, о котором я не придумал?

(Я понимаю, что то, о чем я говорю, окажет большую нагрузку на серверы api reddit, поэтому, вероятно, его не существует, но я подумал, что стоит спросить на всякий случай)


person Sam    schedule 10.04.2018    source источник


Ответы (2)


Да, это существует в PRAW и называется поток. Весь ваш кодовый блок можно заменить следующим:

for post in reddit.subreddit(query_list).stream.submissions():
    # Do something

Вы можете транслировать комментарии субреддита, заменив submissions на comments.

Также можно транслировать другие модели, например Multireddit и Redditor.

person jarhill0    schedule 17.04.2018
comment
Вау, не могу поверить, что не нашел этого в документации, это так полезно! - person Sam; 17.04.2018

Корень вашей проблемы в том, что вы ограничиваете свои результаты только одним постом. На самом деле, вам нужно каждое сообщение с момента последнего просмотра. Попробуйте что-то вроде этого:

while True:
    for post in reddit.subreddit(query_list).new():
        if not newLastProcessed:
            newLastProcessed = post
        if post == lastProcessed:
            break
        # Do something

    lastProcessed = newLastProcessed
    newLastProcessed = None
    time.sleep(30)

Другой альтернативой, которая не так хрупка в отношении упорядочивания, является сохранение идентификаторов обработанных сообщений, например, в базе данных SQLite, а затем запрос их для каждого сообщения, которое вы рассматриваете для обработки.

person Xiong Chiamiov    schedule 12.04.2018