Фильтрация ретвитов с использованием Tweepy / Python в запросе (не в операторах if) - PullRequest
0 голосов
/ 15 октября 2019

Я использую Tweepy 3.8.0 на Python 3 для очистки данных Twitter. Я использую поток, а не курсор, и я использую stream.filter для извлечения твитов на английском языке (код ниже).

Я хочу отфильтровать ретвиты в запросе без использования оператора if вStreamListener, и вместо этого добавьте его в качестве параметра в фильтр, чтобы запрос получал только не ретвиты с той же скоростью, с которой он обычно транслируется. Ретвиты состоят из примерно 3/4 моих данных, и мне приходится извлекать миллионы твитов, так что это займет более месяца, если это сделать с помощью оператора if, поэтому я предпочел бы удалить метку RT с помощью регулярного выражения, а затем отфильтровать дубликаты, а не переместитьэто медленноИначе, есть ли способ, которым я мог бы переписать свой код, который мог бы применить этот фильтр?

Мой код:

import time
import threading
import timing

timing.log()

auth = tweepy.OAuthHandler("client", "secret")
auth.set_access_token("token", "secret")

api = tweepy.API(auth)

tweets = []
#users = []
halt = False

class StreamListener(tweepy.StreamListener):
    def on_status(self, status):
        global tweets
        global halt
        if halt:
            return False
        tweets += [[status.text, status.user.screen_name]]
    def on_error(self, status_code):
        if status_code == 420:
            print("Error")
            timing.endlog()
            return False
        else:
            return True
def stream():
    stream_listener = StreamListener(tweets)
    stream = tweepy.Stream(auth=api.auth, listener=stream_listener)
    stream.filter(languages=["en"], track=["a", "the", "i", "you", "u"], ) # etc

thread1 = threading.Thread(target=stream, args=())
thread1.start()

Мой модуль синхронизации (который просто отслеживает время начала и окончания для меня):

import atexit
from time import time, strftime, localtime
from datetime import timedelta

def secondsToStr(elapsed=None):
    if elapsed is None:
        return strftime("%Y-%m-%d %H:%M:%S", localtime())
    else:
        return str(timedelta(seconds=elapsed))

def log(s="Start Program", elapsed=None):
    line = "="*40
    print(line)
    print(secondsToStr(), '-', s)
    if elapsed:
        print("Elapsed time:", elapsed)
    print(line)
    print()
    return secondsToStr()

def endlog():
    end = time()
    elapsed = end-start
    log("End Program", secondsToStr(elapsed))

start = time()
#atexit.register(endlog)
#log("Start Program")

Я бы хотел иметь возможность отфильтровывать ретвиты в запросе на отправку Tweepy, вместо того чтобы делать это с результатами, чтобы сохранить скорость загрузки 50 твитов / сек.

...