【问题标题】:Error while fetching Tweets with Tweepy使用 Tweepy 获取推文时出错
【发布时间】:2015-04-27 08:12:58
【问题描述】:

我有一个获取推文的 Python 脚本。在脚本中,我使用库 Tweepy 。我使用有效的身份验证参数。运行此脚本后,一些推文存储在我的 MongoDB 中,一些推文被 if 语句拒绝。但我仍然得到错误

requests.packages.urllib3.exceptions.ProtocolError: ('Connection broken: IncompleteRead(0 bytes read, 2457 more expected)'

我的问题是我可以改进脚本的哪一部分,所以我没有收到上面的错误。

这是我的脚本

    from tweepy import Stream
from tweepy import OAuthHandler
from tweepy.streaming import StreamListener
import time
import json
from pymongo import MongoClient

#Mongo Settings
client = MongoClient()
db = client.Sentiment
Tweets = db.Tweet

#Twitter Credentials
ckey ='myckey'
csecret ='mycsecret'
atoken = 'myatoken'
asecret = 'myasecret'

class listener(StreamListener):

    def on_data(self, data):
        try:  

            tweet = json.loads(data)

            if tweet["lang"] == "nl":
                print tweet["id"]
                Tweets.insert(tweet)



            return True
        except BaseException, e:
            print 'failed on_date,', str(e)
            time.sleep(5)

    def on_error(self, status):
        print status

auth = OAuthHandler(ckey, csecret)
auth.set_access_token(atoken, asecret)
twitterStream = Stream(auth, listener())
twitterStream.filter( track=["geld lenen"
                            ,"lening"
                            ,"Defam"
                            ,"DEFAM"
                            ,"Credivance"
                            ,"CREDIVANCE"
                            ,"Alpha Credit"
                            ,"ALPHA CREDIT"
                            ,"Advanced Finance"
                            ,"krediet"
                            ,"KREDIET"
                            ,"private lease"
                            ,"ing"
                            ,"Rabobank"
                            ,"Interbank"
                            ,"Nationale Nerderlanden"
                            ,"Geldshop"
                            ,"Geldlenen"
                            ,"ABN AMBRO"
                            ,"Independer"
                            ,"DGA adviseur"
                            ,"VDZ"
                            ,"vdz"
                            ,"Financieel Attent"
                            ,"Anderslenen"
                            ,"De Nederlandse Kredietmaatschappij"
                            ,"Moneycare"
                            ,"De Financiele Makelaar Kredieten"
                            ,"Finanplaza"
                            ,"Krediet"
                            ,"CFSN Kredietendesk"
                            ,"De Graaf Assurantien en Financieel Adviseurs"
                            ,"AMBTENARENLENING"
                            ,"VDZ Geldzaken"
                            ,"Financium Primae"
                            ,"SNS"
                            ,"AlfamConsumerCredit"
                            ,"GreenLoans"
                            ], languages="nl" 
                     )

希望你能帮帮我……

【问题讨论】:

    标签: python mongodb twitter tweepy


    【解决方案1】:

    当您使用传入的推文starts to fall behind 时,通常会发生此IncompleteRead 错误,鉴于您要跟踪的术语列表很长,这在您的情况下是有道理的。大多数人(包括我自己)似乎采取的一般方法只是抑制此错误并继续您的收集(请参阅上面的链接)。

    我不完全记得IncompleteRead 是否会关闭您的连接(我认为可能,因为我的个人解决方案会重新连接我的流),但您可能会考虑以下类似的事情(我只是要翼翼,它可能需要根据您的情况进行修改):

    # from httplib import IncompleteRead # Python 2
    from http.client import IncompleteRead # Python 3
    ...
    while True:
        try:
            # Connect/reconnect the stream
            stream = Stream(auth, listener)
            # DON'T run this approach async or you'll just create a ton of streams!
            stream.filter(terms)
        except IncompleteRead:
            # Oh well, reconnect and keep trucking
            continue
        except KeyboardInterrupt:
            # Or however you want to exit this loop
            stream.disconnect()
            break
    ...
    

    再一次,我只是在那儿进行临时讨论,但故事的寓意是,这里采用的一般方法是抑制错误并继续。


    编辑(2016 年 10 月 11 日): 对于处理大量推文的任何人来说,这只是一个有用的花絮 - 处理这种情况的一种方法不会失去连接时间或推文将把您传入的推文放入队列解决方案(RabbitMQ、Kafka 等)中,由从该队列读取的应用程序摄取/处理。

    这会将瓶颈从 Twitter API 转移到您的队列,等待您使用数据应该没有问题。

    这更像是一个“生产”软件解决方案,所以如果您不在乎丢失推文或重新连接,上述解决方案仍然完全有效。

    【讨论】:

    • 我在http 包中找不到client。我已经安装了http,但是当我写from http.client import IncompleteRead 时,我收到错误 ImportError: No module named client。有什么想法吗?
    • 在这种情况下你将如何启动服务器?
    • 对于 Python 2,您应该能够直接从 http 包中导入 IncompleteReadfrom http import IncompleteRead。这已在 Python 3 中移至 http.client
    • @dbernard 嗨,尝试过这种方法 - 如问题中所述,Stream 抛出的实际上不是IncompleteRead 异常,而是需要处理的ProtocolError。您介意更新您的答案吗?
    • 将数据放入 on_data 内的 kinesis 仍然会出现相同的错误,并且我已检查 Kinesis 是否正常工作。仅供有相同问题的人参考。
    【解决方案2】:

    我遇到了同样的问题,当我从过滤器函数中删除 languages 时解决了

    因为它还没有功能,虽然 Twitter 说它是

    相反,我会像您在 on_data(..) 中所做的那样检查语言

    我也使用on_status(..) 代替on_data(..) 如下:

    def on_status(self, status):
        ...
        tweet = json.dumps(status)
        if tweet["lang"] == "nl":
            print tweet["id"]
            Tweets.insert(tweet)
        ...
    

    其他人报告说使用twitterStream.filter(track=['word'], languages=['nl']),但我没有。

    【讨论】:

      【解决方案3】:

      IncompleteRead 错误是对网络相关问题的诊断。您在哪里运行该脚本?如果运行此脚本的主机位于防火墙、负载均衡器等网络包的后面,则可能由于某种原因而被丢弃。

      【讨论】:

      • Kadir,感谢您对我的问题的快速回复。我从我的主机运行这个。我能做些什么来减少这个错误信息。或者保持连接活跃!
      • 您好,首先,如果您的主机是公司网络的一部分,那么它可能违反了网络策略。第二次检查您的主机是否正在运行防火墙或安全应用程序(防病毒等),然后将其关闭并重试。
      猜你喜欢
      • 2013-01-01
      • 2022-11-19
      • 2020-09-07
      • 1970-01-01
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 2015-11-08
      相关资源
      最近更新 更多