如何使用pymysql和Tweepy流媒体API正确地连接到MySQL数据库?

2024-04-26 02:20:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Tweepy的流媒体API来收听即将到来的活动的tweets。指定了一些关键字来监听和写入服务器(gearhost)上托管的数据库。在

但是,当在一段时间内没有tweet传入时,它将为下一条tweet显示此错误,并且无法写入我的数据库。在

pymysql.err.OperationalError: (2006, MySQL server has gone away(BrokenPipeError(32, 'Broken Pipe'))")

我已经找到了一些解决方案,比如:Correct way of keeping mysql connection,但似乎对我不起作用。它显示了以下错误:

AttributeError: 'NoneType' object has no attribute 'cursor'

我找到了另一个解决方案,但它说我应该使用连接池,但我是python新手,不知道连接池是如何工作的。在

有人能帮我吗?我的代码是:

import tweepy
from tweepy.streaming import StreamListener

from tweepy import OAuthHandler
from tweepy import Stream
import re
import sys
import json
import pytz
from pytz import timezone

#connect to pymysql
import pymysql

conn = pymysql.connect(host='hosting',
                             user='username',
                             password='password',
                             db='database',
                             autocommit=True,
                             charset='utf8mb4',)



consumer_key = '******'
consumer_secret = '********'
access_token = '****-****'
access_token_secret = '*****'

KEYWORDS = ['singaporepoly','singapore poly', 'sp courses', 'sp open house',
'sp mcdonald', 'sp singapore', 'sp map', 'spoh18', 'sp cca', 'sp career', 'sp library',
'sp part time', 'sp starbucks', '#speye', '#singaporepoly','sp facilities', 'sp polite',
 'sp memories','spgusto', 'sp engineering', 'sp campus','sp bowling', 'sp dmit','sp wifi',
 'sp bowling','sp FC1', 'sp FC2', 'sp FC3', 'sp FC4', 'sp FC5', 'sp FC6', 'sp mae', 'sp eee',
 'sp aircon', 'sp internet','sp mac', 'spdb', 'sp goodies','sp goodie','sp kfc', 'sp bridge',
 'sp mrt', 'sp cls','sp sb','#spbizsch', 'sp jae','sp results','sp result','sp jpsae','sp dsa',
 'sp interview', 'sp eat','sp student','sp camp','sp freshies','sp foc','sp pool','sp class',
 'sp freshmen','sp floorball','sp sports','sp semester','sp cass','sp mass comm','sp information technology',
 'sp event','sp dover','sp moberly','sp performance','spsdz','sp subway','sp chicken rice','sp mini wok',
 'sp mala','sp koufu','sp mcdonalds','Singapore Polytechnic','sp student union','spsu']

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

sgtz = timezone('Asia/Singapore')
utc = pytz.timezone('UTC')

class StdOutListener(StreamListener):
    def on_status(self, status):
        # Printing to Terminal
        if ('Singapore' == status.user.location) or ('Central Region, Singapore' == status.user.location) or ('North-East Region, Singapore' == status.user.location) or ('East Region, Singapore' == status.user.location) or ('West Region, Singapore' == status.user.location):
                    d = status.created_at
                    d_tz = utc.localize(d)
                    localtime = d_tz.astimezone(sgtz)
                    status_list = [localtime, status.author.screen_name, status.text]
                    print (status_list)

            #write to database
                    cur = conn.cursor()
                    cur.execute("USE database")
                    cur.execute("INSERT INTO database.tweets_sp_sg(tweet_time_sp_sg,screen_name_sp_sg,tweets_sp_sg) values (%s,%s,%s)",(status_list))

        def on_error(self, status_code):
            print ('Encountered error with status code:', status_code)
            return True 

if __name__ == '__main__':
    l = StdOutListener()
    auth = OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)

    while True:
            stream = Stream(auth, l, timeout = None)
            stream.filter(track = KEYWORDS, languages=['en'])

Tags: fromimporttokenauthsecretaccessconsumerstatus