from tweepy.streaming import StreamListener
from tweepy import OAuthHandler
from tweepy import Stream
import datetime
import json
access_token = #####
access_token_secret = #####
consumer_key = #####
consumer_secret = #####
class StdOutListener(StreamListener):
def on_status(self, status):
print(status)
today = datetime.datetime.now()
with open('/git/twttrbots/data/Twitter_Raw %s' %
today.strftime("%a-%Y-%m-%d"), 'a') as f:
json.dump(status, f) # <- doesn't work
#f.write(json.dumps(status)) # <- doesn't work
#f.write("Blah") # <- works perfectly fine
if __name__ == '__main__':
while True:
try:
#login using auth
l = StdOutListener()
auth = OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
stream = Stream(auth, l)
#filter by hashtag
stream.filter(track=['bitcoin', 'cryptocurrency', 'wonderlandcoin',
'btc', 'fintech', 'satoshi', 'blockchain',
'litecoin', 'btce'])
except:
print("Whoops, dicsonnected at %s. Retrying"
% datetime.datetime.now())
continue
文件被创建,状态肯定被读取(我的终端中有打印输出)但是在某个地方我的数据被炸成了必杀技,而不是我的文件 - 因为它在0
字节处保持为空。
我发现了类似的案例here,然而在其他平台上,他们使用了json.dumps()
而不是json.dump()
- 尽管我也尝试过这两种功能(使用f.write(dumps(status))
) ,但它们似乎都不起作用。
现在,我不是一个完全傻瓜;我很清楚它可能在我的最后 - 而不是JSON
错误 - 但我无法弄清楚我做错了什么。
我唯一能做的就是把它归结为我open()
语句中出现的错误,让我相信这是open()
模式或者方式我将数据写入文件。我知道这一点,因为上面链接的问题的答案在我的机器上运行正常。
当然,我可以使用子进程模块并调用将print(status)转储到文件的管道,但这不能解决这个问题吗?
附录
根据要求,这是我的控制台output。
Here's当我拨打logger.debug('status dump: %s', json.dumps(status))
时记录器捕获的内容。
答案 0 :(得分:1)
我必须做的初步观察(因为当我试图运行这个脚本时它感到沮丧):
不要使你的except子句过于宽泛,你会抓住所有内容(包括KeyboardInterrupt
)并使其难以停止执行。
这是可选的,但添加适当的中断很好:
except KeyboardInterrupt:
exit()
你正在做的第二件事就是让你的生活变得更加艰难,你不仅要使用裸except
来抓住所有东西;您不是 打印相应的错误 。在这种情况下添加此功能将成为罪魁祸首,指出正确的方向,让您的生活更加轻松。
except Exception as e:
print("Error: ", e)
print("Whoops, dicsonnected at %s. Retrying"
% datetime.datetime.now())
这会输出一个( 相当恶心的 )消息,该消息基本上打印出Status
对象,并以一行通知您此对象:
is not JSON serializable
这有点合乎逻辑,因为我们在这里处理的不是json
个对象,而是从Status
返回的tweepy.Stream
对象。
我不知道为什么tweepy
的创作者确实做到了这一点,相信其背后有充分的理由,但 解决你的问题 您只需访问基础.json
对象:
json.dump(status._json, f)
现在,你应该好好去。
这似乎是与tweepy
到Python 2
过渡相关的内部Python 3.x
问题。具体而言,在文件 streaming.py
:
File "/home/jim/anaconda/envs/Python3/lib/python3.5/site-packages/tweepy/streaming.py", line 171, in read_line
self._buffer += self._stream.read(self._chunk_size) <--
TypeError: Can't convert 'bytes' object to str implicitly
用户 cozos 在tweepy
GitHub存储库中提出了一个解决方案(根据回复,工作情况):
在 streaming.py :
中我将行
161
更改为:
self._buffer += self._stream.read(read_len).decode('ascii')
和第
171
行:
self._buffer += self._stream.read(self._chunk_size).decode('ascii')
然后重新安装。
即使我不确定他的意思是重新安装&#39;。
将tweepy
与Python 2.7.10
一起使用。它就像一个魅力。