Использование нескольких аргументов "название блога" / командной строки с Tumblr API

Некоторое время назад я написал здесь, чтобы получить помощь по использованию API для загрузки данных из блогов Tumblr. birryree (https://stackoverflow.com/users/297696/birryree) был достаточно любезен, чтобы помочь мне исправить мой сценарий и выяснить, где я ошибся, и я без проблем использую его сценарий с (Распечатать более 20 сообщений из Tumblr API).

Этот сценарий требует, чтобы я вручную вводил имя блога, который я хочу загружать каждый раз. Однако мне нужно загрузить сотни блогов, поэтому мне пришлось работать с сотнями версий одного и того же скрипта, что отнимает очень много времени. Я немного погуглил и обнаружил, что можно писать сценарии Python, в которых вы можете вводить аргументы из командной строки, а затем они будут обрабатываться (если это правильная терминология) один за другим.

Я попытался написать сценарий, который позволил бы мне запустить команду из командной строки и затем загрузить три блога, которые я просил в командной строке. (в данном случае "prettythingsicantafford.tumblr.com; theficrecfairy.tumblr.com; and staff.tumblr.com)".

Итак, мой сценарий, который я пытаюсь запустить:

import pytumblr
import sys


def get_all_posts(client, blog):
offset = 0
while True:
    response = client.posts(blog, limit=20, offset=offset, reblog_info=True, notes_info=True)

    # Get the 'posts' field of the response        
    posts = response['posts']

    if not posts: return

    for post in posts:
        yield post

    # move to the next offset
    offset += 20



client = pytumblr.TumblrRestClient('SECRET')
blog = (sys.argv[1], sys.argv[2], sys.argv[3])


# use our function
with open('{}-posts.txt'.format(blog), 'w') as out_file:
for post in get_all_posts(client, blog):
    print >>out_file, post

Я запускаю следующую команду из командной строки

tumblr_test2.py theficrecfairy prettythingsicantafford staff

Однако я получаю следующее сообщение об ошибке:

Traceback (most recent call last):
File "C:\Users\izzy\test\tumblr_test2.py", line 29, in <module>
for post in get_all_posts(client, blog):
File "C:\Users\izzy\test\tumblr_test2.py", line 8, in get_all_posts
response = client.posts(blog, limit=20, offset=offset, reblog_info=True, notes_info=True)
File "C:\Python27\lib\site-packages\pytumblr\helpers.py", line 46, in add_dot_tumblr
args[1] += ".tumblr.com"
TypeError: can only concatenate tuple (not "str") to tuple

Я уже около двух недель пытаюсь изменить свой сценарий в ответ на эту ошибку, но я не смог исправить свою, несомненно, очень очевидную ошибку, и был бы очень благодарен за любую помощь или совет.

ИЗМЕНИТЬ СЛЕДУЮЩИЕ СОВЕТЫ vishes_shell:

Сейчас я работаю со следующим сценарием:

import pytumblr
import sys


def get_all_posts(client, blogs):
for blog in blogs:
    offset = 0
while True:
    response = client.posts(blog, limit=20, offset=offset, reblog_info=True, notes_info=True, filter='raw')

    # Get the 'posts' field of the response        
    posts = response['posts']

    if not posts: return

    for post in posts:
        yield post

    # move to the next offset
    offset += 20


client = pytumblr.TumblrRestClient('SECRET')
blog = sys.argv

# use our function
with open('{}-postsredux.txt'.format(blog), 'w') as out_file:
for post in get_all_posts(client, blog):
    print >>out_file, post

Однако теперь я получаю следующее сообщение об ошибке:

Traceback (most recent call last):
File "C:\Users\izzy\test\tumblr_test2.py", line 27, in <module>
with open('{}-postsredux.txt'.format(blog), 'w') as out_file:
IOError: [Errno 22] invalid mode ('w') or filename: " 
['C:\\\\Users\\\\izzy\\\\test\\\\tumblr_test2.py', 
'prettythingsicantafford', 'theficrecfairy']-postsredux.txt"
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
118
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что вы пытаетесь выполнить client.posts(blog, ...), когда blog является объектом tuple, объявленным как:

blog = (sys.argv[1], sys.argv[2], sys.argv[3])

Вам нужно реорганизовать свой метод, чтобы просматривать каждый блог отдельно.

def get_all_posts(client, blogs):
    for blog in blogs:
        offset = 0
        ...

        while True:
            response = client.posts(blog, ...)
        ...
    ...

blog = sys.argv
...

Спасибо тебе за это! Однако я думаю, что, возможно, неправильно понял ваши инструкции, поскольку я все еще получаю другое сообщение об ошибке (как описано в отредактированном сообщении выше). Возможно, это потому, что то, что я сделал, означает, что он пытается обработать все три аргумента (включая имя сценария) одновременно? Еще раз спасибо за помощь!

Izzy 26.03.2018 10:18

Во-первых, как я вижу по ошибке, я исправил вашу ошибку, поскольку вы получаете все данные, которые вы получали. Новая ошибка возникает просто потому, что вы неправильно пытаетесь записать данные в файл. Предлагаю вам найти решение в существующих вопросах, потому что таких очень много.

vishes_shell 26.03.2018 10:31

Ах, молодец! Я постараюсь исправить это, а затем приму ваш ответ, как только проверю. Спасибо!

Izzy 26.03.2018 13:58

Другие вопросы по теме