Как создать функции для моего скрипта pymongo / twitter?

#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]
  

Я думаю, что это проще.