#python #mongodb #twitter #pymongo
#python #mongodb #Twitter #pymongo
Вопрос:
Я работаю над созданием скриптов с использованием python, mongodb и модуля pymongo для извлечения определенных аспектов API Twitter и сохранения их в базе данных 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». Я считаю, что использование класса Collection pymongo может быть ответом, и я прочитал документацию, но, похоже, не могу заставить ее работать. Если у вас есть другие предложения о том, как я должен сделать этот скрипт более эффективным, они были бы невероятно признательны. В противном случае, пожалуйста, извините за любые ошибки, которые я допустил, как я уже сказал, я новичок в этом.
Ответ №1:
Используйте getattr для получения атрибута по имени строки:
collection = getattr(db, screen_name)
Комментарии:
1. Ага. Это то, что мне было нужно. Мне все равно придется поиграть с тем, как я собираюсь его использовать.
2. Судя по вашему коду, кажется, что вы просто обновили бы ту единственную строку, в которой вы получаете коллекцию. Вы передаете
screen_name
переменную в свою функцию, поэтому после того, как вы получите правильную коллекцию с помощьюgetattr
, у вас будет коллекция для остальной части скрипта.
Ответ №2:
Я бы пошел с:
collection = db[screen_name]
Я думаю, что это проще.