2017-03-10 66 views
0

问题解决了,请参阅解决方案在后在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) 

回答

2

核心问题: 我想你误会了什么流在这里。

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) 
+0

尼斯,@Withnail,我稍后会看看你的答案,并考虑所有的好的细节。提前感谢您的时间和关注!我有一个预感,这将是一个很好的对话和学习机会。兴奋。 – Counter10000

+0

我尝试了你从http://docs.tweepy.org/en/v3.4.0/auth_tutorial.html#auth-tutorial提到的方法,显然它不适合我...我的测试代码被添加到我的文章上面。你介意提供任何意见吗?让我知道你是否有一些工作代码。谢谢! – Counter10000

+0

查看修订答案! – Withnail