2015-04-15 3 views
1

У меня есть проект, чтобы практиковать свои навыки Python:Модифицированный tweepy потока класс

  1. Чтобы извлечь некоторые твиты координаты с Tweepy потока
  2. Чтобы поместить их в таблицу Google
  3. Затем используйте таблицу Google, чтобы создать карту в CartoDB

Я уже могу делать все это самостоятельно. Теперь задача состоит в том, чтобы все работало вместе! :)

Чтобы обновить таблицу Google, я использую gspread.

Однако, чтобы обновить ячейку, мне нужно указать строку и столбец ячейки, как это:

worksheet.update_acell('B1', 'Bingo!') 

Я пытаюсь иметь счетчик в моем сценарии извлечения твитов. Цель состоит в том, чтобы B1 изменился на B2, затем B3, затем B4, каждый раз, когда найден твит.

Но это не работает ... Координаты печатаются на моем терминале, но это все.

Я думаю, что я не использую класс, как я предполагаю. Но я не понимаю, где моя ошибка!

Помощь?

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import tweepy 
import gspread 
import time 

CONSUMER_KEY, CONSUMER_SECRET = 'SECRET', 'SECRET' 
USER_KEY, USER_SECRET = 'SECRET', 'SECRET' 

class MyStream(tweepy.StreamListener): 
    def __init__(self): 
     tweepy.StreamListener.__init__(self) 

     # I added this to have a counter. 
     self.n = 2 

    def on_status(self, tweet): 
     try: 
      longitude = str(tweet.coordinates['coordinates'][0]) 
      latitude = str(tweet.coordinates['coordinates'][1]) 
      print longitude 
      print latitude 

      # I added this to update my google spreadsheet with the coordinates 
      self.wks.update_acell(('A' + str(n)), longitude) 
      self.wks.update_acell(('B' + str(n)), latitude) 
      print "Spreadsheet updated!" 

      # This is for my counter 
      self.n += 1 

     except: 
      pass 


def main(): 

    #I added these two lines to connect to my google spreadsheet 
    gc = gspread.login('EMAIL', 'PASSWORD') 
    wks = gc.open('SPREADSHEET_NAME').sheet1 

    auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET) 
    auth.set_access_token(USER_KEY, USER_SECRET) 
    stream = tweepy.Stream(auth, MyStream(), timeout=50) 
    stream.filter(locations=[-74.00,45.40,-73.41,45.72]) 

if __name__ == "__main__": 
    main() 
+1

Не должно быть 'str (self.n)'? – jonrsharpe

+0

Благодарим за предложение! Я просто попробовал. Тем не менее то же самое ... – Nael

ответ

2

У меня возникли проблемы тестирования это сам (в основном потому, что я не знаком с тем, как tweepy.Stream работает, я думаю), но это не выглядит, как ваш MyStream экземпляр не получает его атрибут wks установить в первую очередь.

Это означает, что, когда вы обратитесь к self.wks, это, вероятно, поднимает AttributeError, но вы никогда не увидите его из-за вашего try/except блока. (Кстати, именно поэтому except: pass имеет тенденцию быть так трудно устранить.)

Вы, вероятно, хотите сделать MyStream взять дополнительный wks аргумент, что-то вроде этого:

def __init__(self, wks): 
    tweepy.StreamListener.__init__(self) 

    # Store the worksheet on this instance. 
    self.wks = wks 

    # I added this to have a counter. 
    self.n = 2 

А затем измените строку где инстанцировании MyStream так теперь передать эту таблицу в качестве аргумента:

stream = tweepy.Stream(auth, MyStream(wks), timeout=50) 
+0

Большое спасибо за ваш ответ! К сожалению, это дает мне тот же результат. :( – Nael

+1

Можете ли вы удалить строки 'try' /' except' в 'on_status' и опубликовать то, что происходит потом? Я предполагаю, что возникает ошибка, которая предоставит некоторую полезную информацию, но часть' except: pass' бросает эту информация – myersjustinc

2

Я нашел ответ!

На самом деле, @jonrsharpe и @myersjustinc, вы оба были правы!

«wks» был неправильно настроен, и я не использовал «self» правильно.

Спасибо! Ваши подсказки помогли мне найти ответы!

EDIT: Итак, вот рабочий код.

class MyStream(tweepy.StreamListener): 
def __init__(self): 
    tweepy.StreamListener.__init__(self) 

    # I added self wks but also the login step on the same line 
    self.wks = gspread.login('EMAIL', 'PASSWORD').open('SPREADSHEET').sheet1 

    # I added this to have a counter. 
    self.n = 2 

def on_status(self, tweet): 
    try: 
     longitude = str(tweet.coordinates['coordinates'][0]) 
     latitude = str(tweet.coordinates['coordinates'][1]) 
     print longitude 
     print latitude 

     # I added this to update my google spreadsheet with the coordinates 
     self.wks.update_acell(('A' + str(self.n)), longitude) 
     self.wks.update_acell(('B' + str(self.n)), latitude) 
     print "Spreadsheet updated!" 

     # This is for my counter 
     self.n += 1 
+1

Вы должны написать свой ответ или принять его! –

+0

О, хорошо. Я редактирую свой пост. Извините! Я новичок в Stackoverflow! :) – Nael

Смежные вопросы