Using Tweepy, I was trying to live stream the Tweets and save it into database sqlite but as soon as I load the JSON file and store into database the error keeps on occurring saying KeyError : created_at
but there already exists a key created_at
. I tried with others too, but still the error persists.
Here is my code:
import sqlite3 conn = sqlite3.connect("twitter.db") import sys import tweepy import json tb_create = "CREATE TABLE tweets2(created_at, favorite_count, favorited, filter_level, lang, retweet_count, retweeted, source, text, truncated, user_created_at, user_followers_count, user_location, user_lang, user_name, user_screen_name, user_time_zone, user_utc_offset, user_friends_count)" c = conn.cursor() c.execute(tb_create) conn.commit import tweepy class MaxListener(tweepy.StreamListener): def on_data(self, raw_data): all_data = json.loads(raw_data) created_at = all_data['created_at'] favorite_count = all_data["favorite_count"] favorited = all_data["favorited"] filter_level = all_data["filter_level"] lang = all_data["lang"] retweet_count = all_data["retweet_count"] retweeted = all_data["retweeted"] source = all_data["source"] text = all_data["text"] truncated = all_data["truncated"] user_created_at = all_data["user"]["created_at"] user_followers_count = all_data["user"]["followers_count"] user_location = all_data["user"]["location"] user_lang = all_data["user"]["lang"] user_name = all_data["user"]["name"] user_screen_name = all_data["user"]["screen_name"] user_time_zone = all_data["user"]["time_zone"] user_utc_offset = all_data["user"]["utc_offset"] user_friends_count = all_data["user"]["friends_count"] c.execute("INSERT INTO tweets2(created_at, favorite_count, favorited, filter_level, lang, retweet_count, retweeted, source, text, truncated, user_created_at, user_followers_count, user_location, user_lang, user_name, user_screen_name, user_time_zone, user_utc_offset, user_friends_count) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", (created_at, favorite_count, favorited, filter_level, lang, retweet_count, retweeted, source, text, truncated, user_created_at, user_followers_count, user_location, user_lang, user_name, user_screen_name, user_time_zone, user_utc_offset, user_friends_count)) conn.commit() def process_data(delf,raw_data): print(raw_data) def on_error(self, status_code): if status_code == 420: return False class MaxStream(): def __init__(self, auth, listner): self.stream = tweepy.Stream(auth=auth, listener=listener) def start(self, keyword_list): self.stream.filter(track= keyword_list) if __name__ == "__main__": listener = MaxListener() from tweepy import OAuthHandler auth = OAuthHandler(ckey, csecret) auth.set_access_token(atoken, asecret) stream = MaxStream(auth, listener) stream.start("python")
error
KeyError Traceback (most recent call last) <ipython-input-4-0bf7c95f9c6c> in <module>() 55 56 stream = MaxStream(auth, listener) ---> 57 stream.start("python") 8 frames <ipython-input-4-0bf7c95f9c6c> in on_data(self, raw_data) 10 all_data = json.loads(raw_data) 11 ---> 12 created_at = all_data['created_at'] 13 favorite_count = all_data["favorite_count"] 14 favorited = all_data["favorited"] KeyError: 'created_at'
Advertisement
Answer
on_data
receives all data from the stream, including message types that aren’t Tweet payloads.
The KeyError
is almost certainly occurring when one of those other message types is received.
You should check for the existence of an attribute specific to Tweets before using it as a Tweet or consider using on_status
instead.