【问题标题】:How to download photos from Flickr by Flickr API in Python 3如何通过 Python 3 中的 Flickr API 从 Flickr 下载照片
【发布时间】:2016-12-14 09:33:24
【问题描述】:

菜鸟问题系列...

我是python的新手,最近想创建一个小的python应用程序,可以根据不同的搜索输入从flickr收集照片。 (例如:如果我输入“狗”,它会从 flickr 下载所有狗的图像)

我在网上做了一些研究,发现 flickr API 可能是最好的方法,而 flickr.photos.getSizes 方法应该是我需要使用的方法。

但是,我在编码时有几个愚蠢的问题:

  1. 我已经为 flickr API 应用了我的密钥和秘密,我只是不知道接下来要在 python 中使用 flickr.photos.getSizes 做什么来下载照片。比如,如何在python中调用这个方法? (我注意到此方法所需的参数是键和 photo_id,如何根据搜索输入“狗”获取 photo_ids)

  2. 然后我按照https://github.com/alexis-mignon/python-flickr-api/wiki/Tutorial 的教程进行操作,但是当我导入 flickr_api 时出现错误消息:

    Could not load all modules
    <class 'ImportError'> No module named 'objects'
    Traceback (most recent call last):
      File "D:/Agfa/Projects/Image/flickr.py", line 2, in <module>
        import flickr_api
      File "D:\Application\Anaconda3\lib\site-packages\flickr_api\__init__.py", line 32, in <module>
        from auth import set_auth_handler
    ImportError: cannot import name 'set_auth_handler'
    

    然后我看了一下_ init _.py:

    try:
        from objects import *
        import objects
        import upload as Upload
        from upload import upload, replace
    except Exception as e:
        print "Could not load all modules"
        print type(e), e
    
    from auth import set_auth_handler
    from method_call import enable_cache, disable_cache
    from keys import set_keys
    from _version import __version__
    

    好像这个库不支持 python 3 但我不知道该怎么做。 (我无法在我的 python 3 上安装 methond_call、keys、_version)猜我会使用 flickrapi

非常感谢您一次又一次地提前感谢。

【问题讨论】:

  • Ahoi 同胞pythonista,flickr_api/__init__.py 使用python2 定义try: except: finally 的方式如果你敢编辑它,那么将except Exception, e: 重写为except Exception as e: 并且至少try/except 将适合蟒蛇3。有一个 py2to3 工具,应该也可以。
  • k,兄弟 :) 我刚刚使用了 pythonanywhere.com 并使用 pip3 install flickrapi --user 安装了 flickrapi 并且可以 import flickrapi 没有任何麻烦。对 init.py 的快速检查给我的印象是,我们没有使用相同的来源。我的是 flickrapi-2.1.2,我没有找到 pip3 的名称 flickr_api 的模块
  • @krysopath 明白了。谢谢。将使用 flickrapi。现在正在努力理解和处理这些方法。再次感谢!
  • 我找到了这个 flickr_api-0.5,它看起来像你上面的摘录。我修复了一些导入错误..将在此处粘贴答案。

标签: python api python-3.x flickr


【解决方案1】:

我想我终于找到了使用 FlickrAPI 的正确方法:

有很多方法,但我想出了2:

def flickr_walk(keyward):
    count = 0
    photos = flickr.walk(text=keyward,
                 tag_mode='all',
                 tags=keyward,
                 extras='url_c',
                 per_page=100)

    for photo in photos:
        try:
            url=photo.get('url_c')
            urllib.request.urlretrieve(url, path+'\\' + str(count) +".jpg")
        except Exception as e:
            print('failed to download image')

flickr.walk 使用 Photos.search API,我也可以直接使用该 API:

def flickr_search(keyward):
    obj = flickr.photos.search(text=keyward,
                           tags=keyward,
                           extras='url_c',
                           per_page=5)

    for photo in obj:
        url=photo.get('url_c')
        photos = ET.dump(obj)
        print (photos)

记得先拿到key和secret:

api_key = 'xxxxxxxxxxxxxxxx'
api_secret = 'xxxxxxxxxxxxx'

flickr=flickrapi.FlickrAPI(api_key,api_secret,cache=True)

【讨论】:

    【解决方案2】:

    我不知道为什么/如何。如果你想在 python3.5+ 中使用 flickr_api 模块,你需要修复 Imports,如下所示:

    try:
        from objects import *
        import objects
        import upload as Upload
        from upload import upload, replace
    except Exception as e:
        #print "Could not load all modules"
        print( type(e), e)
    
    from .auth import set_auth_handler
    from .method_call import enable_cache, disable_cache
    from .keys import set_keys
    from ._version import __version__
    

    在此编辑之后,它失败并出现另一个导入错误:

    >>> import flickr_api
    <class 'SyntaxError'> invalid syntax (method_call.py, line 50)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/home/krysopath/.local/lib/python3.5/site-packages/flickr_api/__init__.py", line 32, in <module>
        from .auth import set_auth_handler
      File "/home/krysopath/.local/lib/python3.5/site-packages/flickr_api/auth.py", line 43, in <module>
        import urlparse
    ImportError: No module named 'urlparse'
    

    所以你可以自己解决这个问题,如果你愿意的话,只需沿着导入错误走并添加一个点将它们转换为绝对导入,这不会失败。

    我想,如果你想使用这个模块,你必须先修复它......并且有一个未知的回报。因此,如果您还没有大量投资,使用其他模块可能会更有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多