Я использую 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 твитов / сек.