如何拆分Twitter流数据并将文本附加到csv文件?

时间:2018-03-24 13:23:06

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

我有一个脚本可以流式传输由一个关键字过滤的Twitter数据。它将数据流式传输到csv文件中,但推文上附有大量对象,例如Id,created_at,text,source等。

我只需要将这些对象中的一些附加到csv文件,但即使在分割数据并仅附加文本对象之后,也会出现一些推文,其中附加了所有推文对象。似乎推文的推文分裂很好,普通的推文却不会分裂。

这是我的代码:

ckey = 'xxxxxxxxxxxxxx'
csecret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx'
atoken = 'xxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
asecret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

auth = OAuthHandler(ckey, csecret)
auth.set_access_token(atoken, asecret)
api = tweepy.API(auth)

def dateRange(start, end):
    current = start
    while(end - current).days >=0:
        yield current
        current = current + datetime.timedelta(seconds = 1)


class Tweetlistener(StreamListener):
    def on_data(self, data):
        startdate = datetime.datetime(2016,6,1)
        enddate = datetime.datetime(2016,6,7)
        for date in dateRange(startdate, enddate):
            try:
                ##This is where I split the data
                tweet = data.split(',"text":"')[1].split('","source')[0]


                saveThis = str(time.time())+'::'+tweet
                saveFile = open('test.csv', 'a')
                saveFile.write(saveThis)
                saveFile.write('\n')
                return True
            except ValueError:
                print("Something went wrong with streaming")
        saveFile.close()

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


twitterStream = Stream(auth, Tweetlistener(), secure = True)
twitterStream.filter(track=['brexit'])

这是csv文件中的结果 The first cell is a retweet and it splits as i intend it to, the cell below isn't a retweet and it appends all tweet objects

第一个单元格是转发,它按照我的意图分割,下面的单元格不是转发,它会附加所有推文对象。

我如何能够分割数据并仅附加文本,created_at,retweet_count,location,coqu ordinates?

编辑:

这是每条推文放入一行的原始数据(不是我的数据,只是我在网上找到的一个例子):

{
 'contributors': None, 
 'truncated': False, 
 'text': 'My Top Followers in 2010: @tkang1 @serin23 @uhrunland @aliassculptor @kor0307 @yunki62. Find yours @ http://mytopfollowersin2010.com',
 'in_reply_to_status_id': None,
 'id': 21041793667694593,
 '_api': ,
 'author': ,
 'retweeted': False,
 'coordinates': None,
 'source': 'My Top Followers in 2010',
 'in_reply_to_screen_name': None,
 'id_str': '21041793667694593',
 'retweet_count': 0,
 'in_reply_to_user_id': None,
 'favorited': False,
 'retweeted_status': ,
 'source_url': 'http://mytopfollowersin2010.com', 
 'user': ,
 'geo': None, 
 'in_reply_to_user_id_str': None, 
 'created_at': datetime.datetime(2011, 1, 1, 3, 15, 29), 
 'in_reply_to_status_id_str': None, 
 'place': None

}

我希望我的数据在这种格式中每行一条推文:

"created_at":Wed Aug 27 13:08:45 +0000 2008::"text"::Example tweet::"retweet_count":154::"favorite_count":200::"coordinates":[-75.14310264,40.05701649]

其中'::'区分对象。

2 个答案:

答案 0 :(得分:2)

您可以使用json decoder执行此任务

import json
required_fields = [u'text', u'created_at', u'retweet_count', u'place',  u'coordinates']

......

      data = data.decode('utf-8')
      json_data = json.loads(data) # this is dict
      tweet = '::'.join([i+':'+unicode(json_data[i]) for i in required_fields])

答案 1 :(得分:1)

我认为你正在获取JSON数据,所以很自然地,在Excel中将这样的文件视为CSV是一个坏主意。

这一行

tweet = data.split(',"text":"')[1].split('","source')[0]

您需要改为解析密钥。例如

import json, csv 

def on_data(self, data):
    tweet = json.loads(data) 
    text = tweet["text"]
    source = tweet["source"]
    with open('test.csv', 'a') as f:
        writer = csv.writer(f)
        writer.writerow([text, source]) 

这个想法不是根据某些字符串将字符串分开,而是实际使用现有结构,然后按名称提取必要字段

Sidenote,我个人发现为每条消息打开和关闭文件的操作都很昂贵,所以我建议找到一种方法,只在流启动和停止时才这样做