Im новый для python, так что легко на меня! Я пытаюсь реализовать прослушиватель потоков через tweepy, который передает твиты на основе фильтра ключевых слов (используется для этого массив строк) и сохраняет эти твиты в коллекции в mongodb (используя pymongo).Создание коллекции MongoDB в pymongo с именем коллекции на основе элемента из stringarray
Я был успешным в этом, но теперь я хочу сделать это дальше, сохранив твиты, отфильтрованные определенной строкой из моего filterKeywords-массива, в коллекцию mongodb, названную после строкового элемента массива, который был отфильтрован (т. е. твит, отфильтрованный строковым элементом «Apple», который будет сохранен в коллекцию mongodb под названием «Apple».
Я попытался сделать это уже без везения через цикл for в методе on_data для циклического перехода по массиву и если элемент найден в твите, тогда попытайтесь создать коллекцию на основе этого ключевого элемента, но он просто создает коллекцию под названием «слово» и сохраняет ее в этом.
Вот мой код ниже (ive оставил мои учетные данные в twitter по очевидным причинам). Надеюсь, кто-то может помочь
import tweepy
import pymongo
import json
consumer_key=""
consumer_secret=""
access_key = ""
access_secret = ""
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_key, access_secret)
api = tweepy.API(auth)
filterKeywords = ['IBM', 'Microsoft', 'Facebook', 'Twitter', 'Apple', 'Google', 'Amazon', 'EBay', 'Diageo',
'General Motors', 'General Electric', 'Telefonica', 'Rolls Royce', 'Walmart', 'HSBC', 'BP',
'Investec', 'WWE', 'Time Warner', 'Santander Group']
class CustomStreamListener(tweepy.StreamListener):
def __init__(self, api):
self.api = api
super(tweepy.StreamListener, self).__init__()
self.db = pymongo.MongoClient().mydb
def on_data(self, tweet):
data = json.loads(tweet)
for word in filterKeywords:
if word in data:
collection = self.db[word]
collection.insert(data),
print (tweet)
def on_error(self, status_code):
return True # Don't kill the stream
def on_timeout(self):
return True # Don't kill the stream
sapi = tweepy.streaming.Stream(auth, CustomStreamListener(api))
sapi.filter(track=filterKeywords)
Что-то вроде 'дб [слова]' 'где слово' переменный со значением' «IBM» 'будет доступ к коллекции под названием' IBM' просто отлично для меня. Что произойдет, если в качестве теста вы замените слово 'word' на строковый литерал, например' cookies ''? – wdberkeley
Я тоже думал, но это не делает для меня. Я также попытался заменить его на строку (использовали «куки», как вы предполагали), и теперь она даже не создает какую-либо коллекцию, даже когда я возвращаю код выше. Это должно быть что-то простое, что мне здесь не хватает. У меня есть еще один взгляд, чтобы понять, почему мой код прекратил создание коллекций. Полная остановка. – philmckendry
Хорошо, мне кажется, что мой оператор if просто не работает вообще, когда я его удаляю, и использую строковый литерал, как было предложено. 'def on_data (Я, чириканье): данные = json.loads (твит) коллекция = дб [ "печенье"] collection.insert (данные), печать (твит) ' есть краткий способ сделать это, а не писать 20 заявлений о делах? Я просто думаю, что это плохой способ закодировать это, и это означает, что если какие-либо изменения потребуются, мне, возможно, придется внести изменения 20 раз, а не один раз. – philmckendry