Самый эффективный способ Twitter Stream? - PullRequest
0 голосов
/ 02 марта 2020

Мой партнер и я начали изучать Python в начале года. Я нахожусь в точке, где а) мой партнер и я почти закончили с нашим кодом, но б) выдернули наши волосы, пытаясь заставить его работать.

Задание: извлекать 250 твитов на основе определенных топик c, геокодирование местоположения твитов, анализ на основе настроений, а затем отображение их на веб-карте. Мы выполнили почти все это, кроме требования 250 твитов.

И я не знаю, как более эффективно использовать твиты. Код работает, но он записывает приблизительно семь-двенадцать строк информации в CSV до истечения времени ожидания.

Я попытался установить параметр отслеживания, но получил эту ошибку: TypeError: 'NoneType' object is not subscriptable'

Я попытался расширить параметр местоположения до stream.filter (location = [- 180, -90,180,90]) , но получил ту же проблему: TypeError: 'NoneType' object has no attribute 'latitude'

Я действительно не знаю, что мне не хватает, и мне было интересно, есть ли у кого-нибудь идеи.

КОД НИЖЕ:

from geopy import geocoders
from geopy.exc import GeocoderTimedOut
import tweepy
from tweepy.streaming import StreamListener
from tweepy import OAuthHandler
from tweepy import Stream
from textblob import TextBlob
import json
import csv

def geo(location):
    g = geocoders.Nominatim(user_agent='USER')
    if location is not None:
        loc = g.geocode(location, timeout=None)
        if loc.latitude and loc.longitude is not None:
            return loc.latitude, loc.longitude

def WriteCSV(user, text, sentiment, lat, long):
    f = open('D:/PATHWAY/TO/tweets.csv', 'a', encoding="utf-8")
    write = csv.writer(f)
    write.writerow([user, text, sentiment, lat, long])
    f.close()

CK = ''
CS = ''
AK = ''
AS = ''

auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AK, AS)

#By setting these values to true, our code will automatically wait as it hits its limits
api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)

#Now I'm going to set up a stream listener
#https://stackoverflow.com/questions/20863486/tweepy-streaming-stop-collecting-tweets-at-x-amount
#https://wafawaheedas.gitbooks.io/twitter-sentiment-analysis-visualization-tutorial/sentiment-analysis-using-textblob.html        
class StdOutListener(tweepy.StreamListener):
    def __init__(self, api=None):
        super(StdOutListener, self).__init__()
        self.num_tweets = 0

    def on_data(self, data):
        Data = json.loads(data)
        Author = Data['user']['screen_name']
        Text = Data['text']
        Tweet = TextBlob(Data["text"])
        Sentiment = Tweet.sentiment.polarity
        x,y = geo(Data['place']['full_name'])
        if "coronavirus" in Text:
            WriteCSV(Author, Text, Sentiment, x,y)
            self.num_tweets += 1
            if self.num_tweets < 50:
                return True
            else:
                return False

stream = tweepy.Stream(auth=api.auth, listener=StdOutListener())
stream.filter(locations=[-122.441, 47.255, -122.329, 47.603])

1 Ответ

1 голос
/ 02 марта 2020

Twitter и Geolocation API возвращают все виды данных. Некоторые поля могут отсутствовать.

TypeError: 'NoneType' object has no attribute 'latitude'

Эта ошибка возникает здесь:

loc = g.geocode(location, timeout=None)
if loc.latitude and loc.longitude is not None:
  return loc.latitude, loc.longitude

Вы предоставляете location, и он ищет такое местоположение, но не может найти, что location. Таким образом, он записывает в loc None.
Следовательно, loc.latitude не будет работать, потому что loc - это None.

Прежде чем получить доступ к любому из его атрибутов, сначала нужно проверить loc. .


x,y = geo(Data['place']['full_name'])

Я знаю, что вы фильтруете твиты по местоположению, и, следовательно, ваш объект статуса Twitter должен иметь Data['place']['full_name']. Но это не всегда так. Вы должны проверить, действительно ли ключ существует, прежде чем получить доступ к значениям.
Это обычно применяется и должно применяться ко всему вашему коду. Напишите надежный код. Вам будет немного легче отлаживать ошибки, если вы реализуете try catch и распечатываете объекты, чтобы посмотреть, как они построены. Возможно, установите точку прерывания в вашем улове и проведите живой осмотр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...