修改后的 tweepy 流 class

Modified tweepy stream class

我有一个项目来练习我的 Python 技能:

  1. 使用 Tweepy Stream 提取一些推文坐标
  2. 将它们放入 Google 电子表格
  3. 然后使用 Google 电子表格在 CartoDB
  4. 中创建地图

我已经可以独立完成所有这些事情了。现在,挑战是让一切协同工作! :)

要更新我的 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