Twitter Akış API'sini Python ile birlikte kullanmanın en iyi yolu geniş bir alanda tweets toplamaktır.Ülke çapında Twitter Akışı Tweepy ile arama nasıl yapılır?
Coğrafi konum, özellikle Kuzey Amerika'daki tweets'in ulusal koleksiyonu ile ilgileniyorum. Şu anda Twitter akış API'sinden tweetleri bir MongoDB veritabanına dökmek için Python ve Tweepy kullanıyorum.
Şu anda bir sınır kutusunda tweet'leri çekmek için API'nın konum filtresini kullanıyorum ve daha sonra tweet'leri yalnızca koordinatlarla depolamak için filtreliyorum. Ben küçük sınırlayıcı kutu (başarıyla NYC ve NYC + New England denedim) yaptık
raise ProtocolError('Connection broken: %r' % e, e)
requests.packages.urllib3.exceptions.ProtocolError: ('Connection broken: IncompleteRead(0 bytes read)', IncompleteRead(0 bytes read))
: Ben sınır kutusu yeterince büyükse, ben bir Python bağlantı hatasından girmek olduğunu tespit ettik Ancak hata yeterince büyük bir sınırlayıcı kutu ile döndüğü gibi görünüyor. Aynı anda birden çok StreamListener çalıştırmayı amaçlayan bir iş parçacığı kullanmayı denedim, ancak API'nın buna izin verdiğini (420 hatası alıyorum) veya en azından benim denediğim şekilde düşünmüyorum. Özel bir StreamListener
sınıfın oluşturulması Tweepy kullanıyorum
:
class MyListener(StreamListener):
"""Custom StreamListener for streaming data."""
# def __init__(self):
def on_data(self, data):
try:
db = pymongo.MongoClient(config.db_uri).twitter
col = db.tweets
decoded_json = json.loads(data)
geo = str(decoded_json['coordinates'])
user = decoded_json['user']['screen_name']
if geo != "None":
col.insert(decoded_json)
print("Geolocated tweet saved from user %s" % user)
else: print("No geo data from user %s" % user)
return True
except BaseException as e:
print("Error on_data: %s" % str(e))
time.sleep(5)
return True
def on_error(self, status):
print(status)
return True
Bu benim Thread
sınıf göründüğünü gibi:
class myThread(threading.Thread):
def __init__(self, threadID, name, streamFilter):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.streamFilter = streamFilter
def run(self):
print("Starting " + self.name)
#twitter_stream.filter(locations=self.streamFilter)
Stream(auth, MyListener()).filter(locations=self.streamFilter)
Ve main
:
if __name__ == '__main__':
auth = OAuthHandler(config.consumer_key, config.consumer_secret)
auth.set_access_token(config.access_token, config.access_secret)
api = tweepy.API(auth)
twitter_stream = Stream(auth, MyListener())
# Bounding boxes:
northeast = [-78.44,40.88,-66.97,47.64]
texas = [-107.31,25.68,-93.25,36.7]
california = [-124.63,32.44,-113.47,42.2]
northeastThread = myThread(1,"ne-thread", northeast)
texasThread = myThread(2,"texas-thread", texas)
caliThread = myThread(3,"cali-thread", california)
northeastThread.start()
time.sleep(5)
texasThread.start()
time.sleep(10)
caliThread.start()