2015-02-18 2 views
3

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) 
+0

Что-то вроде 'дб [слова]' 'где слово' переменный со значением' «IBM» 'будет доступ к коллекции под названием' IBM' просто отлично для меня. Что произойдет, если в качестве теста вы замените слово 'word' на строковый литерал, например' cookies ''? – wdberkeley

+0

Я тоже думал, но это не делает для меня. Я также попытался заменить его на строку (использовали «куки», как вы предполагали), и теперь она даже не создает какую-либо коллекцию, даже когда я возвращаю код выше. Это должно быть что-то простое, что мне здесь не хватает. У меня есть еще один взгляд, чтобы понять, почему мой код прекратил создание коллекций. Полная остановка. – philmckendry

+0

Хорошо, мне кажется, что мой оператор if просто не работает вообще, когда я его удаляю, и использую строковый литерал, как было предложено. 'def on_data (Я, чириканье): данные = json.loads (твит) коллекция = дб [ "печенье"] collection.insert (данные), печать (твит) ' есть краткий способ сделать это, а не писать 20 заявлений о делах? Я просто думаю, что это плохой способ закодировать это, и это означает, что если какие-либо изменения потребуются, мне, возможно, придется внести изменения 20 раз, а не один раз. – philmckendry

ответ

0

я это фиксированный от ответа на другой вопрос, что я спросил, мой PyMongo код на самом деле работал это делать со мной загрузки твитов в формате JSON. Затем для этого нужно было проверить «ключ» для «текстового» ключа, чтобы проверить, содержит ли этот текст один из моих ключевых слов filterKeyword. Вот обновленный on_data методы

def on_data(self, data): 
datajson = json.loads(data) 
for word in filterKeywords: 
    if datajson.get('text') and word in datajson['text']: 
     collection = db[word] 
     collection.insert(datajson) 
     print('Tweet found filtered by ' + word) 
Смежные вопросы