为什么 FlickrAPI 在给出结果后挂起?

Why is FlickrAPI hanging after giving the results?

我正在尝试使用 FlickrAPI 从 Flickr 抓取图像。正在发生的事情是命令行只是停留在那里,在图像 URL 被抓取后没有任何反应。它类似于以下内容:

此屏幕后没有任何反应,它会在这里停留很长时间,有时在 1200 秒或更长时间的范围内。

为了抓取,我使用了以下代码:

def get_urls(search='honeybees on flowers', n=10, download=False):
    t = time.time()
    flickr = FlickrAPI(key, secret)
    license = ()  # https://www.flickr.com/services/api/explore/?method=flickr.photos.licenses.getInfo
    photos = flickr.walk(text=search,  # http://www.flickr.com/services/api/flickr.photos.search.html
                         extras='url_o',
                         per_page=500,  # 1-500
                         license=license,
                         sort='relevance')

    if download:
        dir = os.getcwd() + os.sep + 'images' + os.sep + search.replace(' ', '_') + os.sep  # save directory
        if not os.path.exists(dir):
            os.makedirs(dir)

    urls = []
    for i, photo in enumerate(photos):
        if i < n:
            try:
                # construct url https://www.flickr.com/services/api/misc.urls.html
                url = photo.get('url_o')  # original size
                if url is None:
                    url = 'https://farm%s.staticflickr.com/%s/%s_%s_b.jpg' % \
                          (photo.get('farm'), photo.get('server'), photo.get('id'), photo.get('secret'))  # large size

                download
                if download:
                    download_uri(url, dir)

                urls.append(url)
                print('%g/%g %s' % (i, n, url))
            except:
                print('%g/%g error...' % (i, n))

    # import pandas as pd
    # urls = pd.Series(urls)
    # urls.to_csv(search + "_urls.csv")
    print('Done. (%.1fs)' % (time.time() - t) + ('\nAll images saved to %s' % dir if download else ''))

这个函数调用如下:

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--search', type=str, default='honeybees on flowers', help='flickr search term')
    parser.add_argument('--n', type=int, default=10, help='number of images')
    parser.add_argument('--download', action='store_true', help='download images')
    opt = parser.parse_args()

    get_urls(search=opt.search,  # search term
             n=opt.n,  # max number of images
             download=opt.download)  # download images

我尝试多次查看函数代码,但我似乎无法理解为什么在抓取完成后没有任何反应,因为其他一切都工作正常。

我不能 运行 但我认为所有的问题是它获取了关于 500 张照片的信息 - 因为你有 per_page=500 - 而且它 运行s for-循环播放所有 500 张照片,您必须等待 for-循环结束。

您应该在 n 个图像

之后使用 break 退出此循环
    for i, photo in enumerate(photos):
        if i >= n:
           break
        else: 
            try:
               # ...code ...

或者只是你应该使用 photos[:n] 然后你就不必检查 i < n

    for i, photo in enumerate(photos[:n]):
        try:
           # ...code ...

最终你应该使用 per_page=n


顺便说一句:

您可以使用os.path.join创建路径

dir = os.path.join(os.getcwd(), 'images', search.replace(' ', '_'))

如果您在 makedirs() 中使用 exist_ok=True 那么您不必检查 if not os.path.exists(dir):

if download:
   dir = os.path.join(os.getcwd(), 'images', search.replace(' ', '_'))
   os.makedirs(dir, exist_ok=True)

如果你使用 enumerate(photos, 1) 那么你得到的值是 1,2,3,... 而不是 0,1,2,...