如何为我的pymongo / twitter脚本制作函数?

时间:2011-09-29 21:58:38

标签: python mongodb twitter pymongo

我正在使用python,mongodb和pymongo模块创建脚本来获取Twitter API的某些方面并将它们存储在mongo数据库中。我写了一些脚本来做不同的事情:访问搜索API,访问user_timeline等等。但是,我刚刚开始了解我正在使用的所有工具,现在是时候让我回过头来提高它的效率。因此,现在我正在为我的脚本添加函数和类。这是我的一个没有函数或类的脚本:

#!/usr/local/bin/python

import twitter
import datetime
from datetime import date, timedelta, datetime
import pymongo
from pymongo import Connection

# Twitter handle that we are scraping mentions for
SCREEN_NAME = '@twitterapi'

# Connect to the database
connection = Connection()
db = connection.test    
collection = db.twitterapi_mentions  # Change the name of this database
t = twitter.Twitter(domain='search.twitter.com')

# Fetch the information from the API
results = []
for i in range(2):
    i+=1
    response = t.search(q=SCREEN_NAME, result_type='recent', rpp=100, page=i)['results']
    results.extend(response)

# Create a document in the database for each item taken from the API
for tweet in results:
    id_str = tweet['id_str']
    twitter_id = tweet['from_user']
    tweetlink = "http://twitter.com/#!/%s/status/%s" % (twitter_id, id_str)
    created_at = datetime.strptime(tweet['created_at'], "%a, %d %b %Y %H:%M:%S +0000")
    date = created_at.date().strftime("%m/%d/%y")
    time = created_at.time().strftime("%H:%M:%S")
    text = tweet['text']
    identifier = {'id' : id_str}
    entries = {'id' : id_str, 'tweetlink' : tweetlink, 'date' : date, 'time' : time, 'text' : text, 'twitter_id':twitter_id }
    collection.update(identifier, entries, upsert = True)

这些脚本对我来说效果很好,但我必须为多个twitter句柄运行相同的脚本。例如,我将复制相同的脚本并更改以下两行:

SCREEN_NAME = '@cocacola'

collection = db.cocacola_mentions

因此,我正在提及@twitterapi和@cocacola。我已经考虑过如何将它变成一个函数。我遇到的最大问题是找到一种方法来改变集合的名称。例如,请考虑以下脚本:

#!/usr/local/bin/python

import twitter
import datetime
from datetime import date, timedelta, datetime
import pymongo
from pymongo import Connection

def getMentions(screen_name):

    # Connect to the database
    connection = Connection()
    db = connection.test    
    collection = db.screen_name  # Change the name of this database
    t = twitter.Twitter(domain='search.twitter.com')

    # Fetch the information from the API
    results = []
    for i in range(2):
        i+=1
        response = t.search(q=screen_name, result_type='recent', rpp=100, page=i)    ['results']
        results.extend(response)

    # Create a document in the database for each item taken from the API
    for tweet in results:
        id_str = tweet['id_str']
        twitter_id = tweet['from_user']
        tweetlink = "http://twitter.com/#!/%s/status/%s" % (twitter_id, id_str)
        created_at = datetime.strptime(tweet['created_at'], "%a, %d %b %Y %H:%M:%S +0000")
        date = created_at.date().strftime("%m/%d/%y")
        time = created_at.time().strftime("%H:%M:%S")
        text = tweet['text']
        identifier = {'id' : id_str}
        entries = {'id' : id_str, 'tweetlink' : tweetlink, 'date' : date, 'time' : time, 'text' : text, 'twitter_id':twitter_id }
        collection.update(identifier, entries, upsert = True)

getMentions("@twitterapi")
getMentions("@cocacola")

如果我使用上面的脚本,那么所有数据都存储在集合“screen_name”中,但我希望它存储在通过的屏幕名称中。理想情况下,我希望@twitterapi提到的是“twitterapi_mentions”系列,我希望@cocacola提到的是“cocacola_mentions”系列。我相信使用Pymongo的Collection类可能是答案,我已经阅读了文档,但似乎无法让它工作。如果您对如何使这个脚本更有效率有其他建议,他们将非常感激。否则,请原谅我所犯的任何错误,正如我所说,我是新手。

2 个答案:

答案 0 :(得分:2)

使用getattr按字符串名称检索属性:

collection = getattr(db, screen_name)

答案 1 :(得分:0)

我会选择:

collection = db[screen_name]

我认为这更直接。