Некоторое время назад я написал здесь, чтобы получить помощь по использованию 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"
Проблема в том, что вы пытаетесь выполнить 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
...
Во-первых, как я вижу по ошибке, я исправил вашу ошибку, поскольку вы получаете все данные, которые вы получали. Новая ошибка возникает просто потому, что вы неправильно пытаетесь записать данные в файл. Предлагаю вам найти решение в существующих вопросах, потому что таких очень много.
Ах, молодец! Я постараюсь исправить это, а затем приму ваш ответ, как только проверю. Спасибо!
Спасибо тебе за это! Однако я думаю, что, возможно, неправильно понял ваши инструкции, поскольку я все еще получаю другое сообщение об ошибке (как описано в отредактированном сообщении выше). Возможно, это потому, что то, что я сделал, означает, что он пытается обработать все три аргумента (включая имя сценария) одновременно? Еще раз спасибо за помощь!