1

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

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

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

要更新我的 Google 电子表格,我正在使用gspread

但是,要更新单元格,我需要像这样指示单元格的行和列:

worksheet.update_acell('B1', 'Bingo!')

我试图在我的脚本中设置一个计数器来提取推文。目标是让 B1 更改为 B2,然后是 B3,然后是 B4,每次找到一条推文。

但它不起作用......坐标已在我的终端上打印出来,仅此而已。

我想我没有像我应该的那样使用这个类。但我不明白我的错误在哪里!

帮助?

#!/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()
4

2 回答 2

2

我自己对此进行测试时遇到了麻烦(主要是因为我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)
于 2015-04-15T18:58:18.037 回答
2

我找到了答案!

实际上,@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
于 2015-04-15T20:30:56.957 回答