修改后的 tweepy 流 class
Modified tweepy stream class
我有一个项目来练习我的 Python 技能:
- 使用 Tweepy Stream 提取一些推文坐标
- 将它们放入 Google 电子表格
- 然后使用 Google 电子表格在 CartoDB
中创建地图
我已经可以独立完成所有这些事情了。现在,挑战是让一切协同工作! :)
要更新我的 Google 电子表格,我正在使用 gspread。
但是,要更新单元格,我需要像这样指示单元格的行和列:
worksheet.update_acell('B1', 'Bingo!')
我试图在我的脚本中使用一个计数器来提取推文。目标是让 B1 变成 B2,然后是 B3,然后是 B4,每次找到一条推文。
但它不起作用...坐标打印在我的终端上,仅此而已。
我想我没有按预期使用 class。但是我不明白我的错误在哪里!
帮忙?
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tweepy
import gspread
import time
CONSUMER_KEY, CONSUMER_SECRET = 'SECRET', 'SECRET'
USER_KEY, USER_SECRET = 'SECRET', 'SECRET'
class MyStream(tweepy.StreamListener):
def __init__(self):
tweepy.StreamListener.__init__(self)
# I added this to have a counter.
self.n = 2
def on_status(self, tweet):
try:
longitude = str(tweet.coordinates['coordinates'][0])
latitude = str(tweet.coordinates['coordinates'][1])
print longitude
print latitude
# I added this to update my google spreadsheet with the coordinates
self.wks.update_acell(('A' + str(n)), longitude)
self.wks.update_acell(('B' + str(n)), latitude)
print "Spreadsheet updated!"
# This is for my counter
self.n += 1
except:
pass
def main():
#I added these two lines to connect to my google spreadsheet
gc = gspread.login('EMAIL', 'PASSWORD')
wks = gc.open('SPREADSHEET_NAME').sheet1
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(USER_KEY, USER_SECRET)
stream = tweepy.Stream(auth, MyStream(), timeout=50)
stream.filter(locations=[-74.00,45.40,-73.41,45.72])
if __name__ == "__main__":
main()
我自己测试这个有问题(主要是因为我不熟悉 tweepy.Stream
的工作原理,我想),但看起来你的 MyStream
实例永远不会得到它的 wks
属性设置在第一位。
这意味着当您引用 self.wks
时,它可能会引发 AttributeError
,但由于您的 try
/except
块,您永远不会看到它。 (顺便说一下,这就是为什么 except: pass
往往很难排除故障。)
你可能想让 MyStream
接受一个额外的 wks
参数,像这样:
def __init__(self, wks):
tweepy.StreamListener.__init__(self)
# Store the worksheet on this instance.
self.wks = wks
# I added this to have a counter.
self.n = 2
然后更改您实例化 MyStream
的行,以便您现在将该工作表作为参数传递:
stream = tweepy.Stream(auth, MyStream(wks), timeout=50)
我找到答案了!
实际上,@jonrsharpe 和@myersjustinc,你们都是对的!
"wks" 设置不正确,我没有正确使用 "self"。
谢谢!您的提示帮助我找到了答案!
编辑:这是工作代码。
class MyStream(tweepy.StreamListener):
def __init__(self):
tweepy.StreamListener.__init__(self)
# I added self wks but also the login step on the same line
self.wks = gspread.login('EMAIL', 'PASSWORD').open('SPREADSHEET').sheet1
# I added this to have a counter.
self.n = 2
def on_status(self, tweet):
try:
longitude = str(tweet.coordinates['coordinates'][0])
latitude = str(tweet.coordinates['coordinates'][1])
print longitude
print latitude
# I added this to update my google spreadsheet with the coordinates
self.wks.update_acell(('A' + str(self.n)), longitude)
self.wks.update_acell(('B' + str(self.n)), latitude)
print "Spreadsheet updated!"
# This is for my counter
self.n += 1
我有一个项目来练习我的 Python 技能:
- 使用 Tweepy Stream 提取一些推文坐标
- 将它们放入 Google 电子表格
- 然后使用 Google 电子表格在 CartoDB 中创建地图
我已经可以独立完成所有这些事情了。现在,挑战是让一切协同工作! :)
要更新我的 Google 电子表格,我正在使用 gspread。
但是,要更新单元格,我需要像这样指示单元格的行和列:
worksheet.update_acell('B1', 'Bingo!')
我试图在我的脚本中使用一个计数器来提取推文。目标是让 B1 变成 B2,然后是 B3,然后是 B4,每次找到一条推文。
但它不起作用...坐标打印在我的终端上,仅此而已。
我想我没有按预期使用 class。但是我不明白我的错误在哪里!
帮忙?
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tweepy
import gspread
import time
CONSUMER_KEY, CONSUMER_SECRET = 'SECRET', 'SECRET'
USER_KEY, USER_SECRET = 'SECRET', 'SECRET'
class MyStream(tweepy.StreamListener):
def __init__(self):
tweepy.StreamListener.__init__(self)
# I added this to have a counter.
self.n = 2
def on_status(self, tweet):
try:
longitude = str(tweet.coordinates['coordinates'][0])
latitude = str(tweet.coordinates['coordinates'][1])
print longitude
print latitude
# I added this to update my google spreadsheet with the coordinates
self.wks.update_acell(('A' + str(n)), longitude)
self.wks.update_acell(('B' + str(n)), latitude)
print "Spreadsheet updated!"
# This is for my counter
self.n += 1
except:
pass
def main():
#I added these two lines to connect to my google spreadsheet
gc = gspread.login('EMAIL', 'PASSWORD')
wks = gc.open('SPREADSHEET_NAME').sheet1
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(USER_KEY, USER_SECRET)
stream = tweepy.Stream(auth, MyStream(), timeout=50)
stream.filter(locations=[-74.00,45.40,-73.41,45.72])
if __name__ == "__main__":
main()
我自己测试这个有问题(主要是因为我不熟悉 tweepy.Stream
的工作原理,我想),但看起来你的 MyStream
实例永远不会得到它的 wks
属性设置在第一位。
这意味着当您引用 self.wks
时,它可能会引发 AttributeError
,但由于您的 try
/except
块,您永远不会看到它。 (顺便说一下,这就是为什么 except: pass
往往很难排除故障。)
你可能想让 MyStream
接受一个额外的 wks
参数,像这样:
def __init__(self, wks):
tweepy.StreamListener.__init__(self)
# Store the worksheet on this instance.
self.wks = wks
# I added this to have a counter.
self.n = 2
然后更改您实例化 MyStream
的行,以便您现在将该工作表作为参数传递:
stream = tweepy.Stream(auth, MyStream(wks), timeout=50)
我找到答案了!
实际上,@jonrsharpe 和@myersjustinc,你们都是对的!
"wks" 设置不正确,我没有正确使用 "self"。
谢谢!您的提示帮助我找到了答案!
编辑:这是工作代码。
class MyStream(tweepy.StreamListener):
def __init__(self):
tweepy.StreamListener.__init__(self)
# I added self wks but also the login step on the same line
self.wks = gspread.login('EMAIL', 'PASSWORD').open('SPREADSHEET').sheet1
# I added this to have a counter.
self.n = 2
def on_status(self, tweet):
try:
longitude = str(tweet.coordinates['coordinates'][0])
latitude = str(tweet.coordinates['coordinates'][1])
print longitude
print latitude
# I added this to update my google spreadsheet with the coordinates
self.wks.update_acell(('A' + str(self.n)), longitude)
self.wks.update_acell(('B' + str(self.n)), latitude)
print "Spreadsheet updated!"
# This is for my counter
self.n += 1