如何拆分推特流数据并将文本附加到 csv 文件?
How to split twitter streaming data and append the text to csv file?
我有一个脚本可以流式传输按一个关键字过滤的 Twitter 数据。它将数据流式传输到一个 csv 文件中,但推文上附加了许多对象,例如ID、created_at、文本、来源等
我只需要将这些对象中的一些附加到 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文件中的结果
第一个单元格是转推,它按照我的意图拆分,下面的单元格不是转推,它附加了所有推文对象。
我如何才能拆分数据并仅附加文本、created_at、retweet_count、位置、坐标?
编辑:
这是每条推文放入一行的原始数据(不是我的数据,只是我在网上找到的一个例子):
{
'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]
其中“::”区分对象。
我认为您正在获取 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])
我们的想法不是根据某些字符串将字符串分割开来,而是实际利用其现有结构来发挥您的优势,然后按名称提取必要的字段
旁注,我个人发现为每条消息打开和关闭文件的操作成本很高,因此我建议找到一种方法,仅在流开始和停止时才这样做
您可以使用 json 解码器来完成这项工作
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])
我有一个脚本可以流式传输按一个关键字过滤的 Twitter 数据。它将数据流式传输到一个 csv 文件中,但推文上附加了许多对象,例如ID、created_at、文本、来源等
我只需要将这些对象中的一些附加到 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文件中的结果
第一个单元格是转推,它按照我的意图拆分,下面的单元格不是转推,它附加了所有推文对象。
我如何才能拆分数据并仅附加文本、created_at、retweet_count、位置、坐标?
编辑:
这是每条推文放入一行的原始数据(不是我的数据,只是我在网上找到的一个例子):
{
'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]
其中“::”区分对象。
我认为您正在获取 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])
我们的想法不是根据某些字符串将字符串分割开来,而是实际利用其现有结构来发挥您的优势,然后按名称提取必要的字段
旁注,我个人发现为每条消息打开和关闭文件的操作成本很高,因此我建议找到一种方法,仅在流开始和停止时才这样做
您可以使用 json 解码器来完成这项工作
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])