Как сделать функции для моего скрипта pymongo / twitter? - PullRequest
1 голос
/ 30 сентября 2011

Я работаю над созданием сценариев с использованием 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)

Эти сценарии работают хорошо для меня, но я должен запустить один и тот же сценарий для нескольких дескрипторов твиттера.Например, я скопирую тот же сценарий и изменю следующие две строки:

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

Если я использую приведенный выше сценарий, то все данные сохраняются в коллекции "имя_экранов", но я хочу, чтобы они сохранялись в отображаемом имени экрана,В идеале, я хочу, чтобы упоминания @twitterapi были в коллекции "twitterapi_mentions", и я хочу, чтобы упоминания @cocacola были в коллекции "cocacola_mentions".Я полагаю, что использование класса pymongo Collection может быть ответом, и я прочитал документацию, но не могу заставить ее работать.Если у вас есть другие предложения о том, как мне сделать этот скрипт более эффективным, они будут очень благодарны.В противном случае, пожалуйста, извините за любые ошибки, которые я сделал, как я уже сказал, я новичок в этом.

Ответы [ 2 ]

2 голосов
/ 28 декабря 2011

Используйте getattr для получения атрибута по имени строки:

collection = getattr(db, screen_name)
0 голосов
/ 10 мая 2017

Я бы пошел с:

collection = db[screen_name]

Я думаю, что это более просто.

...