我正在使用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类可能是答案,我已经阅读了文档,但似乎无法让它工作。如果您对如何使这个脚本更有效率有其他建议,他们将非常感激。否则,请原谅我所犯的任何错误,正如我所说,我是新手。
答案 0 :(得分:2)
使用getattr按字符串名称检索属性:
collection = getattr(db, screen_name)
答案 1 :(得分:0)
我会选择:
collection = db[screen_name]
我认为这更直接。