0

私はinstagram APIを使用しています。これが私のコードです。

from instagram.client import InstagramAPI
api = InstagramAPI(access_token='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
tagname = 'naturelover'

photo_urls = []

def get_urls( skeyword, next_max_id=None ):

    tags_recent_media, next = api.tag_recent_media( max_id=next_max_id, tag_name = "%s"%skeyword )
    if tags_recent_media:
        [photo_urls.append(media.images['standard_resolution'].url) for media in tags_recent_media]
        if next is None:
            pass
        else:
            if next.find('max_id') == -1:
                next_max_id = next.split('max_tag_id=')[1]
                next_page_id="%s"%next_max_id.split('&')[0]
            else:
                next_max_id = next.split('max_id=')[1]
                if next_max_id.split('&'):
                    next_page_id="%s"%next_max_id.split('&')[0]

            get_urls( skeyword, next_page_id )
    else:
        pass
    return photo_urls

tag_media_data = get_urls(tagname,inc)
mongo.insert({'media':tag_media_data})

単一のリクエストごとに、instagram は 2o 個の最大画像とページネーション用の次の URLを返します。このタグに基づいてすべての画像を保存しようとしています。次の URLがなくなるまで関数を再帰的に呼び出す必要があります。次のURL IDを取得します(instagram APIはページネーションの次のIDをサポートします)。しかし、max recursion call error が発生しました。このエラーを検索すると、stackrecursion の値を設定するなどの回答が得られましたが、論理的には意味がありません。いくつかの再帰呼び出しまたはその他の代替方法の後に再帰を中断する方法について、これに関する解決策が見つかりません。

コードの最後で、すべてのリスト データを 1 つの mongo ドキュメントに保存しました。別の方法では、これを行うことですべての再帰呼び出しの後にデータを保存しました。次のようなすべてのドキュメントで冗長データを取得しました。

photo_urls = []
[photo_urls.append(media.images['standard_resolution'].url) for media in tags_recent_media]
mongo.insert({'media':photo_urls})

私はまだ他の方法を見つけることができませんでした.私はこれを別の方法でやろうとしています.この問題をもっと説明する必要があるかどうか指摘してください.

4

1 に答える 1

1

再帰は常に明示的なループとして表現できます。次のアプローチを検討してください。

next_page_id = None
while True:
  tags_recent_media, next = api.tag_recent_media(keyword, next_page_id)
  extractImagesFrom(tags_recent_media)
  if not next:
    break
  next_page_id = ...

これは、API 作成者が意図した種類のコードであるに違いありません。

于 2013-11-01T03:28:25.100 に答える