Как транслировать твиты с помощью хэштега с языковым фильтром И с помощью фильтра Tweepy - PullRequest
0 голосов
/ 26 февраля 2020

Итак, что я хочу сделать - это твиты в прямом эфире из Twitters API: только для хештега 'Brexit', только на языке Engli sh и для определенного c количества твитов (1k - 2k).

Пока мой код будет транслировать твиты в прямом эфире, но каким бы способом я его не изменял, я либо получаю игнорирование счетчика и просто потоковую передачу до бесконечности, либо получаю ошибки. Если я изменяю его для потоковой передачи определенных c пользователей, чириканье работает, функция count работает, но игнорирует хэштег. Если я передаю все для данного хэштега, он полностью игнорирует счет. У меня был приличный go в попытке исправить это, но я довольно неопытен и действительно ударил его кирпичной стеной.

Буду очень признателен за помощь в том, как помечать все эти поля одновременно! Приведенный ниже код пока просто транслирует твиты 'Brexit' на неопределенный срок, поэтому игнорирует счет = 10

В нижней части кода немного беспорядок из-за того, что я играл с ним, извинения:

import numpy as np
import pandas as pd
import tweepy
from tweepy import API
from tweepy import Cursor
from tweepy.streaming import StreamListener
from tweepy import OAuthHandler
from tweepy import Stream
import Twitter_Credentials
import matplotlib.pyplot as plt

# Twitter client - hash out to stream all


class TwitterClient:
    def __init__(self, twitter_user=None):
        self.auth = TwitterAuthenticator().authenticate_twitter_app()
        self.twitter_client = API(self.auth)

        self.twitter_user = twitter_user

    def get_twitter_client_api(self):
        return self.twitter_client

# Twitter authenticator


class TwitterAuthenticator:
    def authenticate_twitter_app(self):
        auth = OAuthHandler(Twitter_Credentials.consumer_key, Twitter_Credentials.consumer_secret)
        auth.set_access_token(Twitter_Credentials.access_token, Twitter_Credentials.access_secret)
        return auth

class TwitterStreamer():
    # Class for streaming and processing live Tweets
    def __init__(self):
        self.twitter_authenticator = TwitterAuthenticator()

    def stream_tweets(self, fetched_tweets_filename, hash_tag_list):

        # this handles Twitter authentication and connection to Twitter API
        listener = TwitterListener(fetched_tweets_filename)
        auth = self.twitter_authenticator.authenticate_twitter_app()
        stream = Stream(auth, listener)
        # This line filters Twitter stream to capture data by keywords
        stream.filter(track=hash_tag_list)

# Twitter stream listener

class TwitterListener(StreamListener):
    # This is a listener class that prints incoming Tweets to stdout
    def __init__(self, fetched_tweets_filename):
        self.fetched_tweets_filename = fetched_tweets_filename

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

    def on_error(self, status):
        if status == 420:
            # Return false on data in case rate limit occurs
            return False
        print(status)

class TweetAnalyzer():
    # Functionality for analysing and categorising content from tweets

    def tweets_to_data_frame(self, tweets):
        df = pd.DataFrame(data=[tweet.text for tweet in tweets], columns=['tweets'])

        df['id'] = np.array([tweet.id for tweet in tweets])
        df['len'] = np.array([len(tweet.text) for tweet in tweets])
        df['date'] = np.array([tweet.created_at for tweet in tweets])
        df['source'] = np.array([tweet.source for tweet in tweets])
        df['likes'] = np.array([tweet.favorite_count for tweet in tweets])
        df['retweets'] = np.array([tweet.retweet_count for tweet in tweets])

        return df


if __name__ == "__main__":

    auth = OAuthHandler(Twitter_Credentials.consumer_key, Twitter_Credentials.consumer_secret)
    auth.set_access_token(Twitter_Credentials.access_token, Twitter_Credentials.access_secret)
    api = tweepy.API(auth)

    for tweet in Cursor(api.search, q="#brexit", count=10,
                               lang="en",
                               since="2019-04-03").items():
        fetched_tweets_filename = "tweets.json"
        twitter_streamer = TwitterStreamer()
        hash_tag_list = ["Brexit"]
        twitter_streamer.stream_tweets(fetched_tweets_filename, hash_tag_list)

1 Ответ

0 голосов
/ 27 февраля 2020

Вы пытаетесь использовать два разных метода доступа к API Twitter: потоковая передача выполняется в реальном времени, а поиск - это одноразовый вызов API.

Поскольку потоковая передача является непрерывной и в режиме реального времени, к ней нельзя применить подсчет результатов - код просто открывает соединение и говорит: «Привет, пришлите мне все твиты с этого момента, содержащие hash_tag_list и слушает. В этот момент вы попадаете в StreamListener, где для каждого полученного твита вы записываете их в файл.

Вы можете применить счетчик здесь, но вам нужно оберните его в свой обработчик StreamListener on_data и увеличьте счетчик для каждого полученного твита. Когда вы доберетесь до 1000 твитов, прекратите прослушивание.

Для опции поиска у вас есть пара проблем ... Во-первых, вы запрашиваете твиты с 2019 года, но стандартный API поиска может только go назад 7 дней во времени. Вы, очевидно, попросили только 10 твитов там. Однако, как вы написали метод, на самом деле происходит то, что для каждого твита в коллекции из 10, который возвращает API, вы , а затем создаете потоковое соединение в реальном времени и начинаете слушать и записывать в файл. Так что это не сработает.

Вам нужно будет выбрать один - либо искать 1000 твитов и записывать их в файл (никогда не настраивать TwitterStreamer()), либо прослушивать 1000 твитов и записывать их в файл (сбросьте for Tweet in Cursor(api.search... и прыгайте прямо к серпантину).

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