为什么 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,...
我正在尝试使用 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,...