Pergunta

O código abaixo está transmitindo a linha do tempo pública do Twitter para uma variável que envia quaisquer tweets para o console.Gostaria de salvar as mesmas variáveis ​​(status.text, status.author.screen_name, status.created_at, status.source) em um banco de dados sqlite.Estou recebendo um erro de sintaxe quando meu script vê um tweet e nada é gravado no banco de dados sqlite.

o erro:

$ 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

o código:

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)
Foi útil?

Solução

Está faltando um parêntese de fechamento na última linha do código a seguir (linhas 34 a 37 do que você postou):

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

Basta adicionar um parêntese para fechar a chamada do método imediatamente após o parâmetro da tupla.

Outras dicas

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

então mais tarde:

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

Transparência completa:ainda novo nessas coisas.No entanto, fiz seu código funcionar alterando-o para:

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

Parece-me que você está lendo um status de cada vez.O método executemany seria para quando você tem mais de um status.Por exemplo:

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

Definitivamente não sou um assistente e não tenho certeza do tipo de impacto que o commit() tem em cada entrada...Suponho que o desempenho seja péssimo, mas funciona para um único termo da consulta.

Obrigado por postar seu código, finalmente aprendi como fazer streaming.

Eu sou muito novo em tweepy .Mas essas são as modificações que funcionaram para mim.Você precisa adicionar VALUES após INSERT INTO TWEETS .Além disso, não se esqueça de confirmar as alterações.Este é o link que mencionei: postagem relacionada

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

     con.commit()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top