2011-11-04 46 views
3

我是一个python noob(使用它少于几个小时)。我想在Twitter上读取数据并将其存储在一个数据库蒙戈,但我收到以下错误:如何在python中添加数据到mongoDB

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() 

我敢肯定,这是一个非常简单的修复,希望你们可以提供帮助。谢谢!

回答

2

在收到你必须缓冲的内容。当为“\ 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”功能应该足够了

+0

对不起,我没跟着。我是否只使用on_tweet函数来代替on_receive函数?我试过以上所有的代码,但都没有工作..... – WildBill

2

PyMongo的insert方法需要一个字典,而不是一个字符串。 PyMongo在发送到数据库之前尝试为新记录分配一个ObjectId(因为它还没有)。

我认为错误在你的on_receive函数中。除非pycurl自动为你转换JSON,它很可能只是给你一个来自twitter的API的原始字符串结果。你应该使用json模块来解码字符串,然后适当地处理结果类型 - 也就是说,如果它是一个数组,迭代每个项目,确定它是否需要保存(即,是否已经在数据库中),如果不是,那么只需在新的那些元素上发布insert

编辑:您还应该将safe=True关键字参数添加到insert。如果在服务器端发生错误,您将从PyMongo得到一个异常,这将有助于诊断问题。

+0

我不明白你的帖子。我没有使用保存功能,我正在使用插入项目。当我只是在命令行上做一个'curl'来获取推文并使用相同的语法复制/粘贴时,它就可以工作。 – WildBill

+0

我的错误(一个错字) - 但插入也需要一个字典(即文档)来保存,而不是一个字符串。在保存到MongoDB之前,您仍然需要处理并将从'pycurl'接收的数据转换为正确的格式(即适当的“形状”字典)。不知道你的意思是关于复制和粘贴... – dcrosta

+0

我添加了一个json.loads函数到回调函数。它不会出错,但它也无法加载到数据库中。我错过了别的吗? – WildBill

0

以上编辑/当前代码有效。我错误地查询了数据库,并期望通过mongo控制台看到比我更多的流量。

非常感谢那些帮助过的人,你让我走上了正确的道路,并获得了正确的答案!

相关问题