作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一个获取推文的 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"
)
希望你能帮帮我……
最佳答案
此IncompleteRead
错误通常会在您使用传入推文时发生starts to fall behind ,考虑到您要跟踪的一长串术语,这对您来说是有意义的。大多数人(包括我自己)似乎采取的一般方法只是抑制此错误并继续您的收集(请参阅上面的链接)。
我不完全记得 IncompleteRead
是否会关闭您的连接(我认为可能,因为我的个人解决方案会重新连接我的流),但您可以考虑以下类似的事情(I '我只是去翼,它可能需要为您的情况进行重新设计):
# 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 转移到您的队列,等待您使用数据应该没有问题。
这更像是一个“生产”软件解决方案,所以如果您不在乎丢失推文或重新连接,上述解决方案仍然完全有效。
关于python - 使用 Tweepy 获取推文时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28717249/
我是一名优秀的程序员,十分优秀!