Это мой код для вставки твитов в MYSQL
import pymysql
import tweepy
import time
import json
from tweepy import Stream
from tweepy import OAuthHandler
from tweepy.streaming import StreamListener
import pymysql.cursors
ckey= ''
csecret= ''
atoken=''
asecret=''
conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='admin1234', db='mysql')
cur = conn.cursor()
class listener(StreamListener):
def on_data(self, data):
all_data = json.loads(data)
tweet = all_data["text"]
a=0
#username = all_data["user"]["screen_name"]
cur.execute("INSERT INTO tweet (textt) VALUES (%s)" (tweet))
print (tweet)
return True
def on_error(self, status):
print (status)
auth = OAuthHandler(ckey, csecret)
auth.set_access_token(atoken, asecret)
twitterStream = Stream(auth, listener())
twitterStream.filter(track = ["puasa"])
cur.close()
conn.close()
но я получаю ошибку TypeError: 'str' object is not callable
ошибка трассировки
Traceback (most recent call last):
File "collect-sql.py", line 40, in <module>
twitterStream.filter(track = ["puasa"])
File "/Users/amzar/anaconda3/lib/python3.6/site-packages/tweepy/streaming.py", line 450, in filter
self._start(async)
File "/Users/amzar/anaconda3/lib/python3.6/site-packages/tweepy/streaming.py", line 364, in _start
self._run()
File "/Users/amzar/anaconda3/lib/python3.6/site-packages/tweepy/streaming.py", line 297, in _run
six.reraise(*exc_info)
File "/Users/amzar/anaconda3/lib/python3.6/site-packages/six.py", line 693, in reraise
raise value
File "/Users/amzar/anaconda3/lib/python3.6/site-packages/tweepy/streaming.py", line 266, in _run
self._read_loop(resp)
File "/Users/amzar/anaconda3/lib/python3.6/site-packages/tweepy/streaming.py", line 327, in _read_loop
self._data(next_status_obj)
File "/Users/amzar/anaconda3/lib/python3.6/site-packages/tweepy/streaming.py", line 300, in _data
if self.listener.on_data(data) is False:
File "collect-sql.py", line 30, in on_data
cur.execute("INSERT INTO tweet (textt) VALUES (%s)" (tweet))
TypeError: 'str' object is not callable
Вам нужны две дополнительные запятые:
cur.execute("INSERT INTO tweet (textt) VALUES (%s)", (tweet,))
Первый отделяет строку запроса от аргументов, второй превращает значение в скобках в первый элемент в кортеже из 1 элемента (он действительно работал бы, если бы вы использовали только одну строку вместо кортежа, предполагая, что у вас есть только один аргумент, но это официально не поддерживается от внешнего вида вещей).
Но эта ошибка, о которой вы упомянули в комментариях:
UnicodeEncodeError: 'latin-1' codec can't encode character '\u201c' in position 97: ordinal not in range(256)
означает, что вы пытаетесь интерпретировать текст Unicode, содержащий символ из расширенного набора символов в latin-1
.
Если поле уже определено внутри (в вашей базе данных mysql) как unicode, вам может потребоваться указать набор символов, который будет использоваться при подключении, например:
conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='admin1234', db='mysql', use_unicode=True, charset="utf8")
Если поле в mysql уже не похоже на utf-8, то я рекомендую вам изменить или иным образом переопределить базу данных, чтобы использовать символ юникода для этого столбца.
(tweet,)
в кортеж, заключается в том, что строка - это итеративная последовательность. Если вы передаете в запрос одну строку, не инкапсулируя ее в другой итерируемый, вместо этого python будет перебирать символы строки и пытаться распаковать их один за другим в запрос, что почти всегда вызовет ошибку, поскольку недостаточно параметров привязки для хранения каждого символа; и это вряд ли будет тем, что вы намеревались в любом случае :)
cur.execute("INSERT INTO tweet (textt) VALUES (%s)" (tweet))
после строки и перед(tweet))