Фильтрация данных Twitter с помощью Tweepy

Я использовал учебник Марко Бонзанини по добыче данных в Твиттере: https://marcobonzanini.com/2015/03/02/mining-twitter-data-with-python-part-1/

class MyListener(StreamListener):

    def on_data(self, data):
        try:
            with open('python.json', 'a') as f:
                f.write(data)
                return True
        except BaseException as e:
            print("Error on_data: %s" % str(e))
        return True

    def on_error(self, status):
        print(status)
        return True

и использовал параметр "follow" метода filter для извлечения твитов, созданных этим конкретным идентификатором:

twitter_stream = Stream(auth, MyListener())
twitter_stream.filter(follow=["63728193"#random Twitter ID])

Однако он, похоже, не выполняет миссию, поскольку возвращает не только твиты и ретвиты, созданные идентификатором, но также каждый твит, в котором упоминается идентификатор (т. Е. Ретвиты). Это не то, что я хочу.

Я уверен, что должен быть способ сделать это, так как в файле json, предоставленном Twitter, есть поле "screen_name". В этом поле screen_name указывается имя создателя твита. Мне просто нужно найти способ фильтрации данных в этом поле screen_neame.

1 ответ

Решение

Такое поведение разработано. Чтобы процитировать документы по потоковому API Twitter:

Для каждого указанного пользователя поток будет содержать:

  • Твиты созданные пользователем.
  • Твиты, которые ретвитятся пользователем.
  • Ответы на любой твит, созданный пользователем.
  • Ретвиты любого твита, созданного пользователем.
  • Ручные ответы, созданные без нажатия кнопки ответа (например, "@twitterapi I согласен").

Лучший способ обработать его для ваших целей - проверить, кто создал твит по мере его поступления, что, я думаю, можно сделать следующим образом:

class MyListener(StreamListener):
    def on_data(self, data):
        try:
            if data._json['user']['id'] == "63728193":
                with open('python.json', 'a') as f:
                    f.write(data)
        except BaseException as e:
            print("Error on_data: %s" % str(e))
        return True

    def on_error(self, status):
        print(status)
        return True
Другие вопросы по тегам