如何使用Tweepy在全国范围内进行Twitter Stream搜索?

时间:2016-03-21 14:41:28

标签: python mongodb twitter tweepy twitter-streaming-api

使用Twitter Stream API和Python在大范围内收集推文的最佳方法是什么?

我对地理位置感兴趣,特别是在北美的全国性推文收集。我目前正在使用Python和Tweepy将Twitter流API中的推文转储到MongoDB数据库中。

我目前正在使用API​​的位置过滤器来在边界框内拉取推文,然后我进一步过滤以仅存储带坐标的推文。我发现如果我的边界框足够大,我会遇到Python连接错误:

raise ProtocolError('Connection broken: %r' % e, e)
requests.packages.urllib3.exceptions.ProtocolError: ('Connection broken: IncompleteRead(0 bytes read)', IncompleteRead(0 bytes read))

我已经使边界框变小了(我已经成功地尝试了纽约和纽约+新英格兰),但似乎错误返回了一个足够大的边界框。我也尝试过同时运行多个StreamListener的线程,但我不认为API允许这个(我得到420个错误),或者至少不是我和#的方式# 39; m尝试。

我使用Tweepy设置自定义StreamListener类:

class MyListener(StreamListener):
    """Custom StreamListener for streaming data."""

    # def __init__(self):

    def on_data(self, data):
        try:
            db = pymongo.MongoClient(config.db_uri).twitter
            col = db.tweets

            decoded_json = json.loads(data)
            geo = str(decoded_json['coordinates'])
            user = decoded_json['user']['screen_name']

            if geo != "None":
                col.insert(decoded_json)
                print("Geolocated tweet saved from user %s" % user)
            else: print("No geo data from user %s" % user)
            return True         

        except BaseException as e:
            print("Error on_data: %s" % str(e))
            time.sleep(5)
        return True

    def on_error(self, status):
        print(status)
        return True

这就是我的Thread课程的样子:

class myThread(threading.Thread):
    def __init__(self, threadID, name, streamFilter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.streamFilter = streamFilter

    def run(self):
        print("Starting " + self.name)
        #twitter_stream.filter(locations=self.streamFilter)
        Stream(auth, MyListener()).filter(locations=self.streamFilter)

main

if __name__ == '__main__':

    auth = OAuthHandler(config.consumer_key, config.consumer_secret)
    auth.set_access_token(config.access_token, config.access_secret)
    api = tweepy.API(auth)

    twitter_stream = Stream(auth, MyListener())

    # Bounding boxes:
    northeast = [-78.44,40.88,-66.97,47.64]
    texas = [-107.31,25.68,-93.25,36.7]
    california = [-124.63,32.44,-113.47,42.2]


    northeastThread = myThread(1,"ne-thread", northeast)
    texasThread = myThread(2,"texas-thread", texas)
    caliThread = myThread(3,"cali-thread", california)

    northeastThread.start()
    time.sleep(5)
    texasThread.start()
    time.sleep(10)
    caliThread.start()

2 个答案:

答案 0 :(得分:1)

获得didFinishLaunching没什么不好或不寻常的。连接确实会不时中断。您应该在代码中捕获此错误,然后只需重新启动流。一切都会好的。

顺便说一句,我注意到你正在询问已被弃用的ProtocolError字段。您想要的字段是geo。您可能还会发现coordinates有用。

(Twitter API文档说不允许多个流连接。)

答案 1 :(得分:0)

当您尝试在大地理位置(例如国家或城市)中搜索关键字时,Twitter似乎会分配一个推文块。我认为这可以通过同时运行多个程序流来克服,但作为单独的程序。