tweepy поток в базу данных sqlite - неверный синтаксис - PullRequest
1 голос
/ 24 февраля 2012

Код ниже транслирует общедоступную временную шкалу твиттера для переменной, которая выводит любые твиты на консоль.Я хотел бы сохранить те же переменные (status.text, status.author.screen_name, status.created_at, status.source) в базу данных sqlite.Я получаю синтаксическую ошибку, когда мой скрипт видит твит, а в базу данных sqlite ничего не записывается.

ошибка:

$ python stream-v5.py @lunchboxhq
Filtering the public timeline for "@lunchboxhq"RT @LunchboxHQ: test 2   LunchboxHQ  2012-02-29 18:03:42 Echofon
Encountered Exception: near "?": syntax error

код:

import sys
import tweepy
import webbrowser
import sqlite3 as lite

# Query terms

Q = sys.argv[1:]

sqlite3file='/var/www/twitter.lbox.com/html/stream5_log.sqlite'

CONSUMER_KEY = ''
CONSUMER_SECRET = ''
ACCESS_TOKEN = ''
ACCESS_TOKEN_SECRET = ''

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

con = lite.connect(sqlite3file)
cur = con.cursor()
cur.execute("CREATE TABLE TWEETS(txt text, author text, created int, source text)")

class CustomStreamListener(tweepy.StreamListener):

    def on_status(self, status):

        try:
            print "%s\t%s\t%s\t%s" % (status.text, 
                                      status.author.screen_name, 
                                      status.created_at, 
                                      status.source,)

            cur.executemany("INSERT INTO TWEETS(?, ?, ?)", (status.text, 
                                                            status.author.screen_name, 
                                                            status.created_at, 
                                                            status.source))

        except Exception, e:
            print >> sys.stderr, 'Encountered Exception:', e
            pass

    def on_error(self, status_code):
        print >> sys.stderr, 'Encountered error with status code:', status_code
        return True # Don't kill the stream

    def on_timeout(self):
        print >> sys.stderr, 'Timeout...'
        return True # Don't kill the stream

streaming_api = tweepy.streaming.Stream(auth, CustomStreamListener(), timeout=60)

print >> sys.stderr, 'Filtering the public timeline for "%s"' % (' '.join(sys.argv[1:]),)

streaming_api.filter(follow=None, track=Q)

Ответы [ 4 ]

2 голосов
/ 27 февраля 2012

Вам не хватает закрывающей скобки в последней строке следующего кода (строки 34–37 из того, что вы опубликовали):

            cur.executemany("INSERT INTO TWEETS(?, ?, ?)", (status.text, 
                                                        status.author.screen_name, 
                                                        status.created_at, 
                                                        status.source)

Просто добавьте скобки, чтобы закрыть вызов метода сразу после параметра кортежа.

2 голосов
/ 24 февраля 2012
import sqlite3 as lite
con = lite.connect('test.db')
cur = con.cursor()   

cur.execute("CREATE TABLE TWEETS(txt text, author text, created int, source text)")

затем позже:

cur.executemany("INSERT INTO TWEETS(?, ?, ?, ?)", (status.text, 
                                      status.author.screen_name, 
                                      status.created_at, 
                                      status.source))
0 голосов
/ 27 января 2014

Я совсем новичок в твипи.Но это те модификации, которые работали на меня.Вы должны добавить значения после вставки в твиты.Также не забудьте зафиксировать изменения.Это ссылка, на которую я ссылался: соответствующий пост

     cur.execute("INSERT INTO TWEETS VALUES(?, ?, ?, ?)", (status.text, 
                                                        status.author.screen_name, 
                                                        status.created_at, 
                                                        status.source))

     con.commit()
0 голосов
/ 01 февраля 2013

Полное раскрытие: все еще новичок в этом материале. Однако ваш код заработал, изменив его на:

cur.execute("INSERT INTO TWEETS VALUES(?,?,?,?)", (status.text, status.author.screen_name, status.created_at, status.source))
con.commit()

Мне кажется, что вы читаете по одному статусу за раз. Метод executemany предназначен для случаев, когда у вас более одного статуса. Например:

(['sometext', 'bob','2013-02-01','Twitter for Android'], ['someothertext', 'helga', '2013-01-31', 'MacSomething'])

Я определенно не волшебник и не уверен, какое влияние оказывает коммит () на каждую запись ... Я предполагаю, что производительность ужасна, но она работает для одного термина в запросе.

Спасибо за размещение вашего кода, я наконец-то научился делать потоковую передачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...