Как добавить данные в mongoDB в Python - PullRequest
3 голосов
/ 04 ноября 2011

Я нуб-питон (работаю с ним менее нескольких часов). Я пытаюсь прочитать данные в Твиттере и сохранить их в базе данных Монго, но получаю следующую ошибку:

Traceback (most recent call last):
  File "twit_test.py", line 8, in on_receive
    db.posts.insert(data)
  File "/Library/Python/2.6/site-packages/pymongo-2.0.1-py2.6-macosx-10.6-universal.egg/pymongo/collection.py", line 274, in insert
  File "/Library/Python/2.6/site-packages/pymongo-2.0.1-py2.6-macosx-10.6-universal.egg/pymongo/database.py", line 249, in _fix_incoming
  File "/Library/Python/2.6/site-packages/pymongo-2.0.1-py2.6-macosx-10.6-universal.egg/pymongo/son_manipulator.py", line 73, in transform_incoming
TypeError: 'str' object does not support item assignment
Traceback (most recent call last):
  File "twit_test.py", line 17, in <module>
    conn.perform() 

Мой код очень прост:

import pycurl, json
import pymongo

STREAM_URL = "https://stream.twitter.com/1/statuses/sample.json"
USER = "XXXXXXXX"
PASS = "XXXXXXXX"
def on_tweet(data):
  tweet = json.loads(data)
  db.posts.insert(tweet)

from pymongo import Connection
connection = Connection()
db = connection.test
conn = pycurl.Curl()
conn.setopt(pycurl.USERPWD, "%s:%s" % (USER, PASS))
conn.setopt(pycurl.URL, STREAM_URL)
conn.setopt(pycurl.WRITEFUNCTION, on_tweet)
conn.perform() 

Я уверен, что это ОЧЕНЬ простое исправление, надеюсь, вы, ребята, можете помочь. Спасибо!

Ответы [ 3 ]

2 голосов
/ 05 ноября 2011

При получении вы должны буферизовать содержимое. Когда появляется «\ r \ n», вы получаете твит, и его можно сохранить в mongodb

def on_tweet(data):
    tweet = json.loads(data)
    db.posts.insert(tweet)


 buffer = ""

 def on_receive(data):
     buffer += data.strip()         
     if (data.endswith("\r\n")):    
         if buffer: 
             on_tweet(buffer)
         buffer = ""

РЕДАКТИРОВАТЬ: Я думал, что вы использовали старый потоковый API. функции on_tweet должно быть достаточно

2 голосов
/ 04 ноября 2011

Метод PyMongo insert принимает словарь, а не строку.Вы видите ошибку, когда PyMongo пытается присвоить ObjectId для новой записи (так как у нее ее еще нет) перед отправкой в ​​базу данных.

Я думаю, что ошибка в вашем *Функция 1005 *.Если pycurl не преобразует JSON для вас автоматически, очень вероятно, что он просто даст вам необработанный результат строки из API Twitter.Вы должны использовать модуль json для декодирования строки, а затем соответствующим образом обработать результирующий тип - то есть, если это массив, выполнить итерацию каждого элемента, определить, нужно ли его сохранить (т. Е. Уже есть ли он в вашей базе данных),а если нет, то введите insert только для тех элементов, которые являются новыми.

РЕДАКТИРОВАТЬ: Вы также должны добавить аргумент ключевого слова safe=True в insert.Если на стороне сервера обнаружена ошибка, вы получите исключение от PyMongo, которое поможет диагностировать проблему.

0 голосов
/ 09 ноября 2011

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

Большое спасибо ребятам, которые помогли, вы вывели меня на правильный путь и правильный ответ!

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