2016-03-21 24 views
0

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() 

cevap

1

hakkında kötü bir şey ya da olağandışı bir şey yok. Bağlantılar zaman zaman kırılır. Kodunuzda bu hatayı yakalamanız ve akışı yeniden başlatmanız gerekir. Her şey güzel olacak.

BTW, kullanımdan kaldırılmış olan geo alanını sorguladığınızı farkettim. İstediğiniz alan coordinates. Ayrıca places yararlı bulabilirsiniz.

(Twitter API dosyaları birden akış bağlantıları izin verilmez söylüyorlar.)

0

Size büyük bir geo bir anahtar kelime arama çalıştığınızda twitter tweets bir blok ayırır görünüyor (ülke veya şehir diyelim). Bunun, aynı anda birden çok program akışı gerçekleştirerek, ancak ayrı programlar olarak üstesinden gelinebileceğini düşünüyorum.