在Tweepy运行时间估计流Twitter的与位置过滤
问题解决了,请参阅解决方案在后在Tweepy运行时间估计流Twitter的与位置过滤
我需要帮助估计我tweepy程序调用与位置过滤Twitter的流API运行时间的结束。
我踢了它之后,跑了20多分钟,比我想象的要长。我是Twitter Stream API的新手,并且只使用REST API几天。在我看来,REST API会在几秒钟内为我提供50条推文,非常简单。但是这个Stream请求需要更多时间。我的程序并没有死在我身上,也没有给出任何错误。所以我不知道它是否有什么问题。如果是这样,请指出。
总之,如果您认为我的代码是正确的,您能否提供运行时间的估计值?如果你认为我的代码错了,你能帮我解决吗?
预先感谢您!
下面的代码:
# Import Tweepy, sys, sleep, credentials.py
import tweepy, sys
from time import sleep
from credentials import *
# Access and authorize our Twitter credentials from credentials.py
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
box = [-86.33,41.63,-86.20,41.74]
class CustomStreamListener(tweepy.StreamListener):
def on_error(self, status_code):
print >> sys.stderr, 'Encountered error with status code:', status_code
return True # Don't kill the stream
def on_timeout(self):
print >> sys.stderr, 'Timeout...'
return True # Don't kill the stream
stream = tweepy.streaming.Stream(auth, CustomStreamListener()).filter(locations=box).items(50)
stream
我试过的方法,从http://docs.tweepy.org/en/v3.4.0/auth_tutorial.html#auth-tutorial显然它不工作对我来说...这是我下面的代码。你介意提供任何意见吗?让我知道你是否有一些工作代码。谢谢!
# Import Tweepy, sys, sleep, credentials.py
import tweepy, sys
from time import sleep
from credentials import *
# Access and authorize our Twitter credentials from credentials.py
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
# Assign coordinates to the variable
box = [-74.0,40.73,-73.0,41.73]
import tweepy
#override tweepy.StreamListener to add logic to on_status
class MyStreamListener(tweepy.StreamListener):
def on_status(self, status):
print(status.text)
def on_error(self, status_code):
if status_code == 420:
#returning False in on_data disconnects the stream
return False
myStreamListener = MyStreamListener()
myStream = tweepy.Stream(auth = api.auth, listener=myStreamListener())
myStream.filter(track=['python'], locations=(box), async=True)
以下是错误消息:
Traceback (most recent call last):
File "test.py", line 26, in <module>
myStream = tweepy.Stream(auth = api.auth, listener=myStreamListener())
TypeError: 'MyStreamListener' object is not callable
问题解决了!请参阅解决方案低于
又一轮的调试后,这里是谁可能具有相同的主题感兴趣的一个解决方案:
# Import Tweepy, sys, sleep, credentials.py
try:
import json
except ImportError:
import simplejson as json
import tweepy, sys
from time import sleep
from credentials import *
# Access and authorize our Twitter credentials from credentials.py
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
# Assign coordinates to the variable
box = [-74.0,40.73,-73.0,41.73]
import tweepy
#override tweepy.StreamListener to add logic to on_status
class MyStreamListener(tweepy.StreamListener):
def on_status(self, status):
print(status.text.encode('utf-8'))
def on_error(self, status_code):
if status_code == 420:
#returning False in on_data disconnects the stream
return False
myStreamListener = MyStreamListener()
myStream = tweepy.Stream(api.auth, listener=myStreamListener)
myStream.filter(track=['NYC'], locations=(box), async=True)
核心问题: 我想你误会了什么流在这里。
Tl; dr:你的代码正在工作,你只是没有做任何事情回来的数据。
其余的API调用是一次调用信息。您提出请求后,Twitter会发回一些信息,并将其分配给您的变量。
来自Tweepy的StreamObject(您创建为stream
)通过您的搜索参数打开了twitter的连接,并且Twitter将Tweets推送给它。永远。
从Tweepy文档:
因为 REST API用于从Twitter获取数据,但流API 推送消息持续性会话流API是从REST API完全不同。这使得流式API api 可以实时下载比使用REST API更多的数据。
所以,你需要建立一个处理程序(streamListener
,在tweepy的术语),像this one that prints out the tweets.。
附加
字的警告,从痛苦的经验 - 如果你要尝试和鸣叫保存到数据库:Twitter的可以,而且会,流对象,你的速度远远超过你可以保存他们到数据库。这会导致你的Stream断开连接,因为Twitter上的推文已经备份了,而且在一定程度上的备份(不是实际的短语),他们会断开你的连接。
我通过使用django-rq
来处理这个工作,将保存的工作放入工作队列中 - 这样,我可以每秒处理数百个推文(在高峰期),并且它可以顺利完成。你可以看到我是如何做到这一点。如果你不使用django作为框架,Python-rq也可以工作。 read both
方法只是一个函数,它从推文中读取并将其保存到postgres数据库中。在我的具体情况中,我通过Django ORM使用django_rq.enqueue
函数来完成此操作。
__author__ = 'iamwithnail'
from django.core.management.base import BaseCommand, CommandError
from django.db.utils import DataError
from harvester.tools import read_both
import django_rq
class Command(BaseCommand):
args = '<search_string search_string>'
help = "Opens a listener to the Twitter stream, and tracks the given string or list" \
"of strings, saving them down to the DB as they are received."
def handle(self, *args, **options):
try:
import urllib3.contrib.pyopenssl
urllib3.contrib.pyopenssl.inject_into_urllib3()
except ImportError:
pass
consumer_key = '***'
consumer_secret = '****'
access_token='****'
access_token_secret_var='****'
import tweepy
import json
# This is the listener, responsible for receiving data
class StdOutListener(tweepy.StreamListener):
def on_data(self, data):
decoded = json.loads(data)
try:
if decoded['lang'] == 'en':
django_rq.enqueue(read_both, decoded)
else:
pass
except KeyError,e:
print "Error on Key", e
except DataError, e:
print "DataError", e
return True
def on_error(self, status):
print status
l = StdOutListener()
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret_var)
stream = tweepy.Stream(auth, l)
stream.filter(track=args)
编辑:您的后续问题是由错误地调用侦听器引起的。
myStreamListener = MyStreamListener() #creates an instance of your class
如果你有这样的:
myStream = tweepy.Stream(auth = api.auth, listener=myStreamListener())
你试图当您使用()
调用监听器的功能。因此,它应该是:
myStream = tweepy.Stream(auth = api.auth, listener=myStreamListener)
而事实上,可能只被更简洁地写为:
myStream = tweepy.Stream(api.auth,myStreamListener)
尼斯,@Withnail,我稍后会看看你的答案,并考虑所有的好的细节。提前感谢您的时间和关注!我有一个预感,这将是一个很好的对话和学习机会。兴奋。 – Counter10000
我尝试了你从http://docs.tweepy.org/en/v3.4.0/auth_tutorial.html#auth-tutorial提到的方法,显然它不适合我...我的测试代码被添加到我的文章上面。你介意提供任何意见吗?让我知道你是否有一些工作代码。谢谢! – Counter10000
查看修订答案! – Withnail